MoonCheung

MoonCheung

人生路漫漫,何曾有坦途。:)

理解 Proxy 如何使用

  • Proxy 用於修改某些操作的預設行為,在目標對象之前架設一層「攔截」,外界對該對象的訪問,都必須先通過這層攔截,因此提供了一種機制,可對外界的訪問進行過濾和改寫。
    • get屬性:該方法用於攔截某個屬性的讀取操作,可接受三個參數,依次為目標對象,屬性名和proxy實例本身 (可選參數)
      • 如果訪問目標對象不存在的屬性,會拋出一個錯誤。如果沒有對這個攔截函數,訪問不存在的屬性,只會返回undefined
    • set屬性:該方法用於攔截某個屬性的賦值操作,可接受 4 個參數,依次為目標對象,屬性名,屬性值和proxy實例本身 (可選參數)
    • apply屬性,該方法可接受三個參數,依次為目標對象,目標對象的上下文對象 (this) 和目標對象的參數數組
    • has屬性,該方法用來攔截 HasProperty 操作,即判斷對象是否具有某個屬性時,這個方法會生效,而且可接受兩個參數,依次為目標對象,需查詢的屬性名
    • construct屬性,該方法用於攔截new命令,可接受兩個參數,依次為目標對象,構造函數的參數對象
    • deleteProperty屬性,該方法用於攔截 delete 操作,如果這個方法拋出錯誤或者返回 false,當前屬性就無法被 delete 命令刪除
    • defineProperty屬性,該方法攔截了 Object.defineProperty 操作
    • getOwnPropertyDescriptor屬性,該方法攔截 Object.getOwnPropertyDescriptor (),返回一個屬性描述對象或者 undefined
    • getPrototypeOf屬性,該方法主要用來攔截獲取對象原型,具體來說,攔截下面這些操作:
      • Object.prototype.__proto__
      • Object.prototype.isPrototypeOf()
      • Object.getPrototypeOf()
      • Reflect.getPrototypeOf()
      • instanceof()
    • isExtensible屬性, 該方法攔截 Object.isExtensible 操作
    • ownKeys屬性,該方法用來攔截對象自身屬性的讀取操作,具體來說,攔截下面這些操作:
      • Object.getOwnPropertyNames()
      • Object.getOwnPropertySymbols()
      • Object.keys()
      • for...in...循環
    • preventExtensions屬性,該方法攔截 Object.preventExtensions (),該方法必須返回一個布爾值,否則會被自動轉為布爾值
    • setPrototypeOf屬性,該方法主要用來攔截 Object.setPrototypeOf 方法
    • Proxy.revocable屬性,該方法返回一個可取消的 Proxy 實例
// get,set方法
let proxy = new Proxy({ },{
  get: function(target, prop){
    console.log('設置 get 操作');
    return target[prop];
  },
  set: function(target, prop, value){
    console.log('設置 set 操作');
    target[prop] = value;
  }
})

proxy.time = 35;  // 設置 set 操作 35
console.log(proxy.time);  // 設置 get 操作 35

// has 方法 隱藏某些屬性,不被in運算符發現
let handler = {
  has: function(target, key){
    if(key[0] === '_'){
      return false;
    }
    return key in target;
  }
}

let target = {
  _prop: 'foo',
  prop: 'foo'
}

let proxy = new Proxy(target, handler);
console.log('__prop' in proxy) //打印: false;
console.log('prop' in proxy) //打印: true;
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。