首頁 > web前端 > js教程 > 如何在 JavaScript 中使用「new」運算子動態地將參數傳遞給建構函式?

如何在 JavaScript 中使用「new」運算子動態地將參數傳遞給建構函式?

Mary-Kate Olsen
發布: 2024-12-04 10:58:11
原創
1005 人瀏覽過

How Can I Dynamically Pass Arguments to a Constructor Using the `new` Operator in JavaScript?

使用新運算子克服Apply() 方法的限制

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板