2017-01-23 3 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'の中に手動で置くこともできますが、それはあまりいいとは言えません。このようにコードを配置した特別な理由はありますか? –

+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のコンストラクタのプロトタイプを設定しています。これは、1つは、通常、それを行うだろうかです:

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; 
} 
関連する問題