Proxy handler.getPrototypeOf() 方法

admin發表於2019-04-14

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

此方法可以攔截獲取原型物件操作,返回值是一個物件或者null。

語法結構:

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

引數解析:

(1).target:可選,要被代理的目標物件。能夠被攔截的操作如下:

(1).Object.getPrototypeOf()。

(2).Reflect.getPrototypeOf()。

(3).__proto__。

(4).Object.prototype.isPrototypeOf()。

(5).instanceof。

特別說明:

(1).返回值必須是一個物件或者null,否則會報錯。

(2).如果target物件不可擴充套件,那麼此方法的返回值必須與Object.getPrototypeOf()返回值相同,否則報錯。

程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var obj = {};
var proto = {};
var handler = {
  getPrototypeOf(target) {
    console.log(target === obj);
    console.log(this === handler);
    return proto;
  }
};
var p = new Proxy(obj, handler);
console.log(Object.getPrototypeOf(p) === proto);

上面的程式碼攔截Object.getPrototypeOf()操作。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var obj = {};
var p = new Proxy(obj, {
  getPrototypeOf(target) {
    return Array.prototype;
  }
});
console.log(p instanceof Object);

instanceof操作也會被handler.getPrototypeOf()方法攔截。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let antzone = {
  webName: "螞蟻部落",
  url: "www.softwhy.com",
}
let p = new Proxy(antzone, {
  getPrototypeOf(target) {
    return "螞蟻部落";
  }
});
Object.getPrototypeOf(p);

handler.getPrototypeOf()方法的返回值必須是一個物件或者null,否則會報錯。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let antzone = {
  webName: "螞蟻部落",
  url: "www.softwhy.com",
}
Object.preventExtensions(antzone);
let p = new Proxy(antzone, {
  getPrototypeOf(target) {
    return {};
  }
});
Object.getPrototypeOf(p);

antzone不可擴充套件,所以handler.getPrototypeOf返回值必須和Object.getPrototypeOf返回值相同。

程式碼修改如下:

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

相關文章