代码会说话:
{//es3数据保护
var Person=function(){
var data={
name:'es3',
sex:'male',
age:15
}
this.get=function(key){
return data[key];
}
this.set=function(key,value) {
if(key!=='sex'){
return data[key]=value
}
}
}
//声明一个实例
var person=new Person();
//读取
console.table({name:person.get('name'),sex:person.get('sex'),age:person.get('age')});//es3,male,15
//修改name
person.set('name','es3-cname');
console.table({name:person.get('name'),sex:person.get('sex'),age:person.get('age')});//es3-cname,male,15
//修改sex 修改不了
person.set('sex','female');
console.table({name:person.get('name'),sex:person.get('sex'),age:person.get('age')});//es3,male,15
}
{//es5数据保护 即只读效果
var Person={
name:'es5',
age:15,
}
Object.defineProperty(Person,'sex',{//会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性 并返回这个对象
writable:false,//只读起到保护作用
value:'male'
});
console.table({name:Person.name,age:Person.age,sex:Person.sex});//es5 15 male
Person.name='es5-cname';
console.table({name:Person.name,age:Person.age,sex:Person.sex});//只读属性修改无效 es5-cname 15 male
Person.sex='female';
console.table({a:1,name:Person.name,age:Person.age,sex:Person.sex});//只读属性修改无效 es5 15 male
try{//出问题时不耽误下面的执行
Person.sex='female';
console.table({name:Person.name,age:Person.age,sex:Person.sex});
} catch(e){
console.log(e);
} finally {
}
}
{//es6数据保护 对象代理 放在中间层去写 程序的可控性强
let Person={
name: 'es6',
age: 15,
sex:'male'
};
let person=new Proxy(Person,{//person是暴露给用户操作的对象 把上面的Person保护起来 以后操作的是person 中间代理; Proxy方法传入的大Person是被代理者 Proxy的意思也是将person和Person联系起来 以后所有的限制都可以放在这个中间层来做
get(target,key){//这个get方法类似es5中的getter和setter 读取操作 target指的是person key参数是对象里的属性
return target[key]
},
set(target,key,value){
if(key!=='sex'){
target[key]=value;
}
}
})
console.table({name:Person.name,age:Person.age,sex:Person.sex})//es6 15 male
try{
person.sex='female';
person.name='es6-cname';
} catch (e){
console.log(e);
} finally {
}
console.log({name:person.name,age:person.age,sex:person.sex})//es6-cname 15 male
console.log({name:Person.name,age:Person.age,sex:Person.sex})//es6-cname 15 male
}
整理以自鉴 不喜请补充~ 嗯嘛