使用「新」運算子擴充.apply() 的功能
在JavaScript 中,.apply() 方法允許使用函數使用函數使用指定的物件上下文和作為數組傳遞的參數進行呼叫。然而,問題出現了:.apply() 可以與「new」運算子結合使用來建立物件實例嗎?
您提供的初始程式碼片段嘗試執行此操作,但不幸的是,這種方法是JavaScript 本身不支援。
但是,已經提出了幾種巧妙的解決方案來克服此限制。一種特別優雅的方法是在ECMAScript5 中使用Function.prototype.bind:
function newCall(Cls) { return new (Function.prototype.bind.apply(Cls, arguments)); }
此函數接受類別或構造函數作為其第一個參數,以及應傳遞給構造函數的任何其他參數。然後,它使用 Function.prototype.bind 建立一個新函數,該函數具有與建構函數相同的上下文以及預先綁定的附加參數。最後,「new」關鍵字用於基於此綁定函數建立一個新的物件實例。
另一個可能的解決方案涉及使用eval() 函數:
function evalConstructor(str, args) { return eval('new (' + str + ')(' + args + ')'); }
此函數採用表示建構函數和參數數組的字串表達式,然後將此字串計算為JavaScript 表達式。產生的程式碼本質上與直接使用 new 運算子相同,但它允許您傳遞可變數量的參數。
這些解決方案提供了創建具有可變數量參數的物件實例的便捷方法,從而增強了JavaScript 建構函數機制的功能。
以上是`.apply()` 可以與 `new` 運算子一起使用來建立 JavaScript 物件嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!