# Ninja chapter 8 控制物件存取 8.1 範例 使用 Ninja 建構器函式 設值與取值 skillLevel 無法直接取得私有變數 skillLevel ![](https://i.imgur.com/oTSKLB9.png) 8.2 範例 在物件實值裡定義取值器和設值器: 在屬性前加上 get or set *取值器不要加參數 *看似是取得屬性,實際上是執行方法 ![](https://i.imgur.com/VQI4HBk.png) 可以直接存取到ninjaCollection.ninjas 但注意不能執行 ninjaCollection.firstNinja() ![](https://i.imgur.com/bGOHxZw.png) 8.3 範例 constructor : 建構器函式 用 new 呼叫類別時會被執行 可以直接存取到 ninjaCollection.ninjas ![](https://i.imgur.com/CBJHruI.png) 8.4 範例 使用 Object.difeineProperty 定義取值器和設值器 差異在於某些情境需要用到私有物件屬性時 拿不到 _skillLevel ![](https://i.imgur.com/DZhCgt6.png) 8.5 範例 對物件屬性進行設值器驗證,用途於變數型別異常 ![](https://i.imgur.com/Ib4HgNm.png) 8.6 範例 當有想要取得的物件屬性是由物件屬性組合而成時,可以使用這個範例的做法 8.7 範例 使用 proxy 建構器函式 控制物件存取 var p = new Proxy(target, handler); target 是想要套用 proxy 的物件 handler 是寫需求的 proxy 物件,裡面放方法 方法中的 target 表示 被proxy 套用的物件 方法中的 key 表示 被套用物件的屬性 ![](https://i.imgur.com/hUtKr18.png) 可以多做效能解析、自動設值 關鍵字有 get、set、has deleteProperty、ownKeys defineProperty、apply construct 可以查看這裡面 http://es6.ruanyifeng.com/#docs/proxy ```javascript= // 可以讓下斜線的屬性被隱藏起來 (in 運算子) var handler = { has (target, key) { if (key[0] === '_') { return false; } return key in target; } }; var target = { _prop: 'foo', prop: 'foo' }; var proxy = new Proxy(target, handler); '_prop' in proxy // false // 可以阻止Object.keys 找到全部屬性 let target = { a: 1, b: 2, c: 3 }; let handler = { ownKeys(target) { return ['a']; } }; let proxy = new Proxy(target, handler); Object.keys(proxy) // [ 'a' ] ``` 8.8 範例 vs 8.9 範例 8.8 只為一個物件屬性的取值設值做紀錄 8.9 中任何對物件屬性的取值設值都會被記錄 8.10 範例 測試效能範例程式實作 ![](https://i.imgur.com/zDc0aJZ.png) target 是目標函式 thisArg 是目標函式的 this ```javascript= fun.apply(thisArg, [argsArray]) // thisArg // 讓 fun 呼叫時可以視為 this 的值。 // 注意,這可能並不是最後會在方法裡看見的值: // 如果這是一個在非 non-strict mode 下運作的程式碼, // null 及 undefined 將會被全域物件取代,而原始類別將被封裝。 ``` https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Function/apply args 是傳入目標函式的參數 ![](https://i.imgur.com/XmVwhAG.png) 8.11 範例 自動設值範例程式實作 index = +index 用一元加法運算子將屬性變成數字的測試 ![](https://i.imgur.com/GN91XLt.png) 8.12 範例 陣列反過來數程式實作 8.13 範例 對 8.12 寫的方法做效能測試