js 中三种实现私有化内部数据的方式
通过暴露 set 和 get 两个公共 api 的方式,通过这两个 api 对内部数据进行操作和保护,规则可以写在 get 和 set 方法中
function Person = {
var data = {
name: ‘es3’,
sex: ‘female’,
age: 12
};
this.get = function (key) {
return data[key];
}
this.set = function (key, value) {
if (key !== ‘sex’) {
data[key] = value;
}
}
};
var person = new Person();
console.table({
name: person.get(‘name’),
sex: person.get(‘sex’),
age: person.get(‘age’)
});// name: ‘es3’, sex: ‘female’, age: 12
person.set(‘sex’, ‘male’); // person.get(‘sex’) === ‘female’ 对 set 做了判断,所以设置没用,这样就通过定义实例的 set 和 get 方式来保护 内部的 data 变量
直接使用 defineProperty 对数据属性进行限制
// 不能设置规则,哪种情况哪些属性可以读写,使用 defineProperty 就搞不定
var Person = {
name: ‘es3’,
sex: ‘female’,
age: 12
};
Object.defineProperty(Person, ‘sex’, {
writable: false,
value: ‘female’
});
Person.sex = ‘male’; // Person.sex === female; 会失败, 严格模式会报错。
使用 Proxy 对象代理
var Person = {
name: ‘es3’,
sex: ‘female’,
age: 12
};
let person = new Proxy(Person, {
get(target, key) {
// target 就是 Person, key 就是属性, 这里也可以定义规则
return target[key];
},
set(target, key, value) {
// 可以在这里进行各种规则设置
if (key !== ‘sex’) {
target[key] = value;
}
}
});
person.sex = ‘male’; // 不起作用