亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在‘new’操作符中使用.application()。這個是可能的嗎?

在‘new’操作符中使用.application()。這個是可能的嗎?

一只名叫tom的貓 2019-06-13 19:21:48
在‘new’操作符中使用.application()。這個是可能的嗎?在JavaScript中,我希望創建一個對象實例(通過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答案從這里的回復中可以清楚地看出,這里沒有內置的呼叫方式。.apply()帶著new接線員。然而,人們提出了一些真正有趣的解決方案。我更喜歡的解決辦法是這張是馬修·克魯姆利寫的(我修改了它以通過arguments財產):var createSomething = (function() {     function F(args) {         return Something.apply(this, args);     }     F.prototype = Something.prototype;     return function() {         return new F(arguments);     }})();
查看完整描述

3 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

下面是一個通用的解決方案,它可以調用任何構造函數(除了作為函數調用時行為不同的本機構造函數,如StringNumberDate等等)帶有一系列參數:

function construct(constructor, args) {
    function F() {
        return constructor.apply(this, args);
    }
    F.prototype = constructor.prototype;
    return new F();}

通過調用construct(Class, [1, 2, 3])創建的對象是相同的。new Class(1, 2, 3).

您還可以制作一個更具體的版本,這樣就不必每次都傳遞構造函數。這也會稍微提高效率,因為每次調用它時,它都不需要創建內部函數的新實例。

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

    return function(args) {
        return new F(args);
    }})();

創建和調用外部匿名函數的原因是保留函數。F不污染全局命名空間。它有時被稱為模塊模式。

[最新情況]

對于那些希望在類型記錄中使用此方法的人,因為TS給出了一個錯誤,如果F返回任何內容:

function construct(constructor, args) {
    function F() : void {
        constructor.apply(this, args);
    }
    F.prototype = constructor.prototype;
    return new F();}


查看完整回答
反對 回復 2019-06-13
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

如果您的環境支持ECMA腳本2015的傳播運營商(...),您可以這樣簡單地使用它

function Something() {
    // init stuff}function createSomething() {
    return new Something(...arguments);}

注:現在ECMA腳本2015的規范已經發布,并且大多數JavaScript引擎都在積極地實現它,這將是最好的方法。

您可以在少數幾個主要環境中檢查擴展操作符的支持,這里.


查看完整回答
反對 回復 2019-06-13
  • 3 回答
  • 0 關注
  • 465 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號