Proxy handler.getOwnPropertyDescriptor() 方法

admin發表於2019-04-15

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

此方法能夠攔截Object.getOwnPropertyDescriptor()操作。

返回值是物件或者undefined。

語法結構:

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

引數解析:

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

(2).prop:可選,要獲取特性描述的屬性名稱。

特別說明:

(1).如果返回值不是物件或者undefined會報錯。

(2).如果target物件自有屬性是不可配置,那麼返回值不能是undefined,否則會報錯。

(3).如果target物件是不可擴充套件的,那麼返回值不能是undefined,否則會報錯。

(4).如果物件是不可擴充套件且指定屬性不是物件自有,那麼返回值必須是undefined,否則會報錯。

(5).如果屬性不是物件的自有屬性,或者此屬性是物件可配置自有屬性,那麼返回屬性描述物件configurable屬性值必須為true,否則報錯。

程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let antzone = {
  webName: "螞蟻部落",
  url:"www.softwhy.com"
}
var p = new Proxy(antzone, {
  getOwnPropertyDescriptor: function(target, prop) {
    console.log(prop);
    return { configurable: true, enumerable: true, value: "antzone" };
  }
});
Object.getOwnPropertyDescriptor(p, "webName");

上面程式碼可以攔截Object.getOwnPropertyDescriptor()操作,返回一個自定義的屬性特性描述物件。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let antzone = {
  webName: "螞蟻部落",
  url:"www.softwhy.com"
}
var p = new Proxy(antzone, {
  getOwnPropertyDescriptor: function(target, prop) {
    console.log(prop);
    return { configurable: true, enumerable: true, value: "antzone" };
  }
});
Reflect.getOwnPropertyDescriptor(p, "webName");

上面程式碼攔截Reflect.getOwnPropertyDescriptor()操作,返回返回一個自定義的屬性特性描述物件。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let antzone = {
  webName: "螞蟻部落",
  url:"www.softwhy.com"
}
Object.defineProperty(antzone, "webName", {
  writable: true,
  enumerable: true,
  configurable: false
})
var p = new Proxy(antzone, {
  getOwnPropertyDescriptor: function(target, prop) {
    console.log(prop);
    return undefined;
  }
});
Reflect.getOwnPropertyDescriptor(p, "webName");

程式碼會報錯,因為antzone的webName屬性是不可擴充套件的。

而handler.getOwnPropertyDescriptor()返回值是undefined。

相關文章