首頁 > web前端 > js教程 > JavaScript 的 new 運算子可以與 .apply() 方法一起使用嗎?

JavaScript 的 new 運算子可以與 .apply() 方法一起使用嗎?

Barbara Streisand
發布: 2024-12-17 09:31:25
原創
345 人瀏覽過

Can JavaScript's `new` Operator Work with the `.apply()` Method?

.apply() 方法可以與 new 運算子一起使用嗎?

在 JavaScript 中,通常使用 new 運算子建立物件實例涉及明確地將參數傳遞給建構函式。但是,可能需要傳遞可變數量的參數。本問題探討了結合使用 .apply() 方法和 new 運算子來實現這種靈活性的可能性。

挑戰

最初,人們可能會嘗試以下程式碼:

function Something() {
    // init stuff
}
function createSomething() {
    return new Something.apply(null, arguments);
}
var s = createSomething(a, b, c); // 's' is an instance of Something
登入後複製

但是,這種方法不起作用,因為new 運算符與.apply()不相容

解決方案

已經提出了各種解決方案來克服此限制:

1. Matthew Crumley的方法

此解法採用從目標建構子繼承的中間函數:

var createSomething = (function() {
    function F(args) {
        return Something.apply(this, args);
    }
    F.prototype = Something.prototype;

    return function() {
        return new F(arguments);
    }
})();
登入後複製

2。 Function.prototype.bind

ECMAScript5 引入了 Function.prototype.bind 方法,該方法允許部分應用函數:

function newCall(Cls) {
    return new (Function.prototype.bind.apply(Cls, arguments));
}
登入後複製

可以如下使用:

var s = newCall(Something, a, b, c);
登入後複製

使用優點Function.prototype.bind

這個方法有幾個優點:

  • 它適用於所有構造函數,包括像Date 這樣的特殊建構子。
  • 它可以是使用簡潔,直接將參數傳遞給new。
  • 它保留了原始建構子的prototype.

說明

Function.prototype.bind 建立一個繼承函數的新原始屬性函數。透過部分應用具有所需參數的建構函數,我們可以使用 new 關鍵字建立一個實例。

以上是JavaScript 的 new 運算子可以與 .apply() 方法一起使用嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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