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