学c++和java的时候,我们都可以快速方便地定义私有属性,但在js里面要定义私有属性就比较麻烦了。
es5中可以依靠Object.defineProperty()这个方法定义私有属性。
var Person = {
name:'haha',
age:15
}
Object.defineProperty(Person,'sex',{
writable:false,//设为只读
value:'male'
});
try{
Person.sex = 'female';
console.log(Person.sex);//sex属性还是male,并没有被改掉
}catch(e){
console.log(e);
}
在es6中我们可以使用对象代理,中间加个代理层来定义私有属性。
let Person = {
name:'haha',
sex:'male',
age:15
};
let person = new Proxy(Person,{
get(target,key){
return target[key]
},
set(target,key,value){
if(key!=='sex'){
target[key]=value;
}
}
});
try{
person.sex = 'female';
console.log(Person.sex);//sex属性还是male,并没有被改掉
}catch(e){
console.log(e);
}
Proxy是es6提供的新方法。
使用代理的方式,用户操作的其实是person,而不是Person,这种方式可以在代理层中定义很多逻辑复杂的拦截规则,但是不会影响原始对象数据,是个很好的方法。
网友评论