在JavaScript 中,apply() 方法允許將任意數量的參數作為數組傳遞到預先定義的函數,可能會擴展其功能。然而,當與物件實例化所必需的 new 運算子結合使用時,這種方法提出了一個獨特的挑戰:建構函數通常需要固定數量的參數。
我的問題源自於建立物件實例的意願使用 new 運算符,同時動態地向建構函式提供參數。
障礙:
最初,我試圖實現這個概念:
function Something(){ // Initializations } function createSomething(){ return new Something.apply(null, arguments); } var s = createSomething(a,b,c); //'s' is an instance of Something
然而,事實證明這種方法無效。
解決問題:
提出了許多解決方案來回應我的查詢,但沒有提供 apply() 與 new 運算子的無縫整合。我們提出了替代解決方案,每個方案都有自己的優點和注意事項。
首選解決方案:
Matthew Crumley 提出的最能引起我共鳴的解決方案採用了一種巧妙的方法使用Function.prototype.bind 和中間函數的方法:
var createSomething = (function() { function F(args) { return Something.apply(this, args); } F.prototype = Something.prototype; return function() { return new F(arguments); } })();
這種方法避開apply() 並使用一個單獨的函數F,它實現了預期的功能。
另一個可行的選項:
Simon Lyall 提供的另一個值得注意的解決方案利用了 Function .prototype.bind 和eval():
function createSomething(){ var args = [].slice.call(arguments), constr = eval("new ("+Something.name+"(" + args+ "))"); return constr; }
雖然優雅簡潔,但這種方法依賴於eval(),這可能會引起對不同環境之間的安全性和兼容性的擔憂。
結論:
儘管apply() 方法提供了一種強大的方法來處理動態由於參數數量較多,JavaScript 中仍然不支援與new 運算符的直接整合。相反,可以使用替代解決方案來實現類似的功能,從而允許使用不同的參數靈活建立物件實例。
以上是如何在 JavaScript 中使用「new」運算子動態地將參數傳遞給建構函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!