1、利用闭包特性
2、利用Object.freeze函数(推荐)
3、利用Object.defineProperty函数(推荐)
4、利用Object.seal函数(推荐) //封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变
5、利用Object.preventExtensions函数 //让一个对象变的不可扩展,也就是永远不能再添加新的属性。但是可以修改原有属性值
建议采用"use strict"严格模式。这样修改的时候回提示错误,不然就不提错误,但不能修改会不成功
1、设置一个局部变量实现,使用function对象
function LockObj(name,age)
{
let datainfo = {name,age} //声明一个变量,存储保护对象
this.show = function(){
console.log(`${datainfo.name} ${datainfo.age}`)
};
return this;
}
let p1 = new LockObj("js",12);
p1.show();
p1.datainfo ={name:"ceshi",age:16}
p1.show();
参考https://www.jb51.net/article/124712.htm
2、利用Object.freeze或者Object.defineProperty函数
function LockObj(name,age)
{
this.name = name;
this.age = age;
this.show = function(){
console.log(`${this.name} ${this.age}`)
};
//Object.freeze(this)
Object.defineProperty(this,"name",{
writable:false
})
return this;
}
let p1 = new LockObj("js",12);
console.log(Object.getOwnPropertyDescriptor(p1,"name")); //可以查看配置哪些项
p1.show();
p1.name = "ceshi"
p1.show();
let obj = {
name:"js",age:12,
}
//Object.freeze(obj)
Object.defineProperty(obj,"name",{
writable:false
})
obj.name = 2 //错误提示
console.log(obj)
3、利用Object.seal或者Object.preventExtensions函数
不能再添加新的属性。但是可以修改原有属性值
let obj = {
name : "js",age :12
}
//Object.seal(obj);
Object.preventExtensions(obj);
//obj.desc = "add"; //提示错误
obj.name = "new"; //修改成功
console.log(obj);
Object.getOwnPropertyDescriptor(obj, prop) obj需要查找的目标对象 ;prop目标对象内属性名称
Object.defineProperty(obj, prop, descriptor) obj要定义属性的对象 ;prop要定义或修改的属性的名称或 Symbol ;descriptor要定义或修改的属性描述符
Object.defineProperties可以设置多个
//descriptor描述的说明
//writable 当且仅当属性的值可以被改变时为true。(仅针对数据属性描述有效)
//configurable 当且仅当指定对象的属性描述可以被改变或者属性可被删除时,为true。
//enumerable 当且仅当指定对象的属性可以被枚举出时,为 true。
//参考
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object