Proxy handler.ownKeys() 方法

admin發表於2019-06-17

關於Proxy更多內容可以參閱JavaScript Proxy和Reflect一章節。

此方法可以攔截Object.getOwnPropertyNames()操作。

返回值是一個陣列。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
var p = new Proxy(target, {
  ownKeys: function (target) {
    //code
  }
});

引數解析:

(1).target:可選,要被代理的目標物件。

可以被攔截的操作列表如下:

(1).Object.getOwnPropertyNames()。

(2).Object.getOwnPropertySymbols()。

(3).Object.keys()。

(4).Reflect.ownKeys()。

特別說明:

(1).返回值通常是一個包含屬性名稱陣列。

(2).返回陣列的元素的型別是字串型別或者Symbol型別。

(3).返回陣列必須包含所有target物件自有不可配置的屬性名稱。

(4).如果target物件是不可擴充套件的,那麼返回陣列必須且只包含target物件所有的自有屬性名稱。

程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var antzone = {
  webName: "螞蟻部落",
  url: "www.softwhy.com",
  age: 4,
  address:"青島市南區"
}
var p = new Proxy(antzone, {
  ownKeys: function(target) {
    return ["a", "b", "c"];
  }
});
console.log(Object.getOwnPropertyNames(p))

Object.getOwnPropertyNames()方法會被攔截,返回值是一個自定義的陣列。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var antzone = {
  webName: "螞蟻部落",
  url: "www.softwhy.com",
  age: 4,
  address:"青島市南區"
}
Object.defineProperty(antzone, "webName", {
  configurable: false
})
var p = new Proxy(antzone, {
  ownKeys: function(target) {
    return ["url", "age", "address","a"];
  }
});
console.log(Object.getOwnPropertyNames(p))

返回的陣列必須要包含不可配置的屬性名稱。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var antzone = {
  webName: "螞蟻部落",
  url: "www.softwhy.com",
  age: 4,
  address:"青島市南區"
}
Object.preventExtensions(antzone);
var p = new Proxy(antzone, {
  ownKeys: function(target) {
    return ["url", "age", "address","webName","a"];
  }
});
console.log(Object.getOwnPropertyNames(p))

由於antzone物件是不可擴充套件的,那麼返回陣列元素值只包含antzone物件所有的自有屬性名稱。

相關文章