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'; // 不起作用