簡體   English   中英

如何用方括號表示法實現這個 curry function "add"?

[英]How do I achieve this curry function "add" with square bracket notation?

我朋友發給我這張圖,顯示可以無限鏈數的function add ,然后是output求和。

截屏

我正在考慮使用Proxy將密鑰數字加在一起並重寫其Symbol.toPrimitive function,但它似乎不起作用而且我不確定發生了什么......

我的方向是正確的還是有更好的方法?

 let add = new Proxy( { [Symbol.toPrimitive]() { return this.value; }, value: 0 }, { get(target, key, receiver) { if(Symbol.toPrimitive === key) { return target[Symbol.toPrimitive]; } else if (.isNaN(key)) { target;value += +key; } return add, }; } ). console;log(+add[1]). console;log(+add[1][2][3]). console;log(+add[10][-5][3][100]);

您的問題是[Symbol.toPrimitive](){}方法中的this是您的代理,而不是您的target object (即:代理構造函數的第一個 object 參數)。 這會導致您的代理獲取陷阱觸發,從而導致您的toPrimitive方法不返回原語,而是返回 object(因此您的代碼拋出)。 這是因為,當您執行:

console.log(+add[1]);

您正在將代理( add[1] )轉換為原始數值。 發生這種情況時,JavaScript 將嘗試從該代理中獲取Symbol.toPrimitive function。 發生這種情況時,您的處理程序 object 中的get陷阱將運行,並返回在目標 object 上定義的Symbol.toPrimitive function object。然后引擎調用此返回的 function,並將this設置為代理而不是處理程序對象)。 在代碼中,你可以想到當 JS 將你的代理add[1]轉換為數字時會發生以下情況:

const input = add[1]; // your proxy
const exoticToPrim = input[Symbol.toPrimitive]; // gets the Symbol.toPrimitive function from your object
const result = exoticToPrim.call(input, "number"); // !! calls `Symbol.toPrimitive` !!

此處的規范中概述了上述步驟。 從最后一行可以看出,調用Symbol.toPrimitive() function 時this設置作為您的代理值,這會導致以下代碼也導致您的 get 陷阱觸發:

[Symbol.toPrimitive]() {
  return this.value;
}

上面, this.value觸發你的處理程序 object 中的get方法以value的鍵觸發,因為this代表你的代理,導致觸發 get 陷阱。 因為您的 get 陷阱在key設置為value時返回代理,所以您的Symbol.toPrimitive方法不會返回原語,而是返回您的app代理,這會導致您的代碼拋出。 一個簡單的快速修復是處理在您的 object 上訪問value的情況(請注意,我還重置了value ,以便每個日志都不會從以前的日志中累積):

 let add = new Proxy( { [Symbol.toPrimitive]() { return this.value; }, value: 0 }, { get(target, key, receiver) { if(key === Symbol.toPrimitive) { return target[key]; } else if(key === 'value') { const sum = target[key]; target[key] = 0; return sum; } else if (.isNaN(key)) { target;value += +key; } return add, }; } ). console;log(+add[1]). console;log(+add[1][2][3]). console;log(+add[10][-5][3][100]);

另一種選擇是更改被調用的toPrimitive function,您可以通過返回包裝您的toPrimitive function 的 function 並使用設置為target object 的新this值調用它來實現。您還可以在此重置您的值計數新包裝 function:

 let add = new Proxy( { [Symbol.toPrimitive]() { return this.value; }, value: 0 }, { get(target, key, receiver) { if(key === Symbol.toPrimitive) { return (...args) => { const prim = target[key].apply(target, args); target.value = 0; return prim; }; } else if (.isNaN(key)) { target;value += +key; } return add, }; } ). console;log(+add[1]). console;log(+add[1][2][3]). console;log(+add[10][-5][3][100]);

暫無
暫無

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

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