.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
這個方法有幾個優點:
說明
Function.prototype.bind 建立一個繼承函數的新原始屬性函數。透過部分應用具有所需參數的建構函數,我們可以使用 new 關鍵字建立一個實例。
以上是JavaScript 的 new 運算子可以與 .apply() 方法一起使用嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!