2017-01-23 31 views
-1

我的目標是性能從其它函數的原型添加到主要功能(這)方面Submain如何在原型中使用call()?

function Main() { 
    Submain.call(this); 
    //from here I want to be able to use this.a, this.b, this.c, this.d 
    //...Main code... 
} 

function Submain() { 
    //this works fine 
    this.a = 1; 
    this.b = 2; 

    //this does not work because of the context 
    this.doThis(); 
} 

Submain.prototype.doThis = function() { 
    this.c = 3; 
    this.d = 4; 
} 

那麼,如何使用Submain原型用於此目的?

+0

我明白你的意思了。我不知道你希望得到什麼樣的解決方案。您提供的對象沒有該方法。你可以手動把它放在'Main'或'Main.prototype'裏面,但這看起來不太好。您是否有特殊原因以這種方式安排您的代碼? – 2017-01-23 23:51:18

+0

您可以添加doThing方法而不是使用原型。但是一個不好的選擇(對很多對象的性能影響)。 更好的選擇可以從Submain原型 [見這裏](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain)複製主原型,以更好地理解原型設計鏈的工作原理 – allevo

+0

事實上,我的主要原型是巨大的,所以我想將它切成幾個文件以更加模塊化。我可以使用sub = new Submain()然後使用sub.c,sub.d,但我問自己是否有其他解決方案。 – zbeyens

回答

0

如果我理解正確,那麼缺少的部分是設置Main構造函數的原型。這是一個怎樣通常會做到這一點:

Object.setPrototypeOf(Main.prototype, Submain.prototype); 

然後,你可以調用從構造函數中或任何其他方法與new Main創建的對象doThis

var main = new Main(); 
console.log(main.c, main.d); // prints 3, 4 
+0

我的一般理解是'setPrototypeOf'帶有巨大且難以跟蹤的性能問題,即使在微不足道的應用程序中也是如此? – furkle

+0

@furkle這是來自ES6之前的城市傳奇,但仍然被MDN推廣。 –

+0

真的嗎?那裏有任何文件嗎?因爲如果是這樣的話,那對我來說非常有用;反序列化對象並重新添加原型方法是一種痛苦,但MDN上的語言是......令人恐懼的。 – furkle

0

我不得不合並Submain原型到主要原型

這可以用Object.assign(ES6)完成。

function Main() {} 

Main.prototype = Object.assign(Submain.prototype, { 
    doThat: function() { 
     Submain.call(this); 
     //from here I can use this.a, this.b, this.c, this.d 
    }, 
    //...Main functions... 
}); 

function Submain() { 
    this.a = 1; 
    this.b = 2; 

    //this works now 
    this.doThis(); 
} 

Submain.prototype.doThis = function() { 
    this.c = 3; 
    this.d = 4; 
}