Proxy handler.setPrototypeOf() 方法

admin發表於2019-04-13

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

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

返回一個布林值用來說明原型物件是否設定成功。

語法結構:

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

引數解析:

(1).target:最原始的目標物件。

(2).prototype:物件的新原型物件,可以是null。

特別說明:

(1).如果target物件不可擴充套件,那麼prototype必須是最初的Object.getPrototypeOf(target)。

(2).handler.setPrototypeOf()方法如果返回false,如果是Object.setPrototypeOf()被攔截,那麼會丟擲一個錯誤,如果是Reflect.setPrototypeOf()被攔截,那麼就返回false。

程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var newProto = {
  address:"青島市南區"
};
var target = {
  webName:"螞蟻部落"
};
var handler = {
  setPrototypeOf(target, newProto) {
    Reflect.setPrototypeOf(target, newProto);
    console.log("螞蟻部落");
    return true;
  }
};
var p = new Proxy(target, handler);
Object.setPrototypeOf(p, newProto);

上面的程式碼中,設定原型的操作會被handler.setPrototypeOf()攔截。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var newProto = {
  address:"青島市南區"
};
var target = {
  webName:"螞蟻部落"
};
var handler = {
  setPrototypeOf(target, newProto) {
    Reflect.setPrototypeOf(target, newProto);
    return false;
  }
};
var p = new Proxy(target, handler);
Object.setPrototypeOf(p, newProto);

如果handler.setPrototypeOf()返回false,並且攔截的是Object.setPrototypeOf()操作,會丟擲一個異常。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var newProto = {
  address:"青島市南區"
};
var target = {
  webName:"螞蟻部落"
};
var handler = {
  setPrototypeOf(target, newProto) {
    Reflect.setPrototypeOf(target, newProto);
    return false;
  }
};
var p = new Proxy(target, handler);
console.log(Reflect.setPrototypeOf(p, newProto));

如果handler.setPrototypeOf()返回false,並且攔截的是Reflect.setPrototypeOf()操作,返回值是false。

相關文章