Proxy handler.apply() 方法

admin發表於2019-04-15

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

此方法可以攔截Proxy例項作為函式呼叫的操作,包括call()或者apply()方式呼叫。

可以返回任意型別的值。

語法結構:

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

引數解析:

(1).target:可選,要被代理的目標物件,是一個函式。

(2).thisArg:可選,target目標函式被呼叫時,this指向的物件。

(3).argumentsList:可選,傳遞給p()的引數。

程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var p = new Proxy(function() {}, {
  apply: function(target, thisArg, argumentsList) {
    console.log(argumentsList.join(", "));
    return argumentsList[0] + argumentsList[1] + argumentsList[2];
  }
});
console.log(p(1, 2, 3));

將Proxy例項用作函式呼叫,那麼就會被handler.apply()攔截。

target是被代理的目標物件(一個函式),argumentsList就是傳遞給P()的引數。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let obj = {
  webName:"螞蟻部落"
}
var p = new Proxy(function() {}, {
  apply: function(target, thisArg, argumentsList) {
    console.log(thisArg.webName);
  }
});
p.apply(obj, [4]);

以apply或者call方式呼叫p,也會被handler.apply()方法攔截,傳遞的obj物件會被handler.apply()的thisArg引數接收。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
var obj = {
  webName:"螞蟻部落"
}
function func() {
  console.log(this.webName);
}
var p = new Proxy(func, {
  apply: function (target, thisArg, argumentsList) {
    console.log("呼叫被攔截");
    console.log(thisArg);
    console.log(argumentsList);
  }
});
Reflect.apply(p, obj, [2])

使用Reflect.apply()方式呼叫p也可以被handler.apply()攔截。

關於Reflect.apply()的用法可以參閱Reflect.apply()方法一章節。

相關文章