簡體   English   中英

為什么 JS 中有 Proxy «apply» 陷阱?

[英]Why is there the Proxy «apply» trap in JS?

Proxy看起來像 API 以擴展我們操作對象的方式,例如為所有屬性制作單個 getter。 有一個名為apply的代理陷阱會干擾 function 調用。 根據文檔,此陷阱只能與函數一起使用,因此可以使用沒有代理的普通舊 JavaScript 代碼來實現此陷阱:

// Proxy method
const trappedFunction = new Proxy(originalFunction, {
  apply: function(target, thisArg, argumentsList) {
    console.log(thisArg, argumentsList);
    return target.apply(thisArg, argumentsList);
  }
});

// Higher order function method
var trappedFunction = function () {
  console.log(this, arguments);
  return originalFunction.apply(this, arguments);
};

據我所知,上述實現是相同的(除了不是數組但可以輕松轉換為數組的arguments值)。

實現真的相同嗎? 為什么存在“應用”陷阱? 與普通的高階 function 相比,它可以提供什么?

實現真的相同嗎?

除了arguments差異之外,就運行時行為而言,我看不出它們之間有任何區別。 我個人會改為

var trappedFunction = function (...args) {
  console.log(this, args);
  originalFunction.apply(this, args);
};

無論如何都要避免arguments

為什么存在“應用”陷阱? 與普通的高階 function 相比,它可以提供什么?

因為您可能想同時使用其他陷阱。 無法創建也是代理的高階 function。 您可以在技術上創建一個高階 function 然后用代理包裝它,但我想這會很快變得復雜,然后您在代理處理程序和函數包裝邏輯之間拆分類似陷阱的行為,其中apply陷阱連同所有的 rest 一起,讓事物保持清晰的關聯。

我還要補充一點,除非您絕對知道您確實必須使用代理並且可以使您的代理的行為與原始 object 一樣,這比您想象的要困難得多,否則我會堅持使用更高階的 function 方法.

代理的引入為我們提供了以前不可用的 object 訪問可能性,例如任何屬性的單個 getter。

我個人會反對這個定義。 引入Proxy是為了允許 JS 代碼實現 JS object 本身的行為。 作為副作用,這意味着 JS 代碼需要能夠攔截對所有屬性的訪問,即使它們不存在,但我會猶豫稱其為引入它的原因。 底層的“陷阱”處理程序方法已經在 ECMAScript 規范中定義,並且 JS 引擎已經在內部公開它們以允許 C++ 定義 JS object 的行為方式,用於任何內置瀏覽器 API 和事物。 Proxy向 JS 本身公開這些相同的鈎子,以允許 JS 本身實現任何 API,否則您只能在 C++ 中實現。

不,它們不相同。 您的第一個trappedFunctonoriginalFunction的代理,這意味着它的行為與originalFunction完全一樣,除了其身份和攔截操作(在您的示例中記錄 arguments 並從調用中刪除返回值)。

第二個trappedFunction是一個完全獨立的 function object,它與originalFunction的唯一相似之處在於它在調用時執行相同的操作。 但是trappedFunction.prototype.= originalFunction.prototype等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM