2012-01-01 3 views
4

JSを数ヶ月使用した後、この動作に慣れました。私はJavaの背景のために非常に困惑しています。私はクラスを作成し、サブクラスを作成します。 サブクラスのコンストラクタを呼び出すと、親コンストラクタは呼び出されません。さて、私はこの動作について読んだ、それは正常なようだ、そう?継承:コンストラクタは "super"を実行しませんか?

これを参照してください。example明確にするために

は、だから私のサブクラスのコンストラクタは、親コンストラクタのそれぞれを実行させる、私はjsfiddle example

[OK]をご覧ください(以下を追加している、より良い、このように動作するようです。 は今、私は以下について思ったんだけど?

GameObject.prototype = new Node(); 
GameObject.prototype.constructor=GameObject; 

(更新jsfiddle exampleを参照)

:;ウィッヒを指定する方法が引き金そのコンストラクタのないスーパークラスが存在しているようには例えば以下の は、Node()メソッドを実行します

私はそれを正しくやっていないと感じることはできません。私の実際のモデルは7つのサブクラスにわたって階層化されているので、コンストラクタ(6 + 5 + 4 + 3 + 2 + 1 = 21)には合計21回の呼び出しがあります。

何か間違っていますか?御時間ありがとうございます!

答えて

1

一般的に、正しく実行しています。しかし、あなたのコンストラクタ関数はインスタンス上にプロパティを作成し、それらのプロパティは継承コンストラクタのプロトタイプに割り当てられます。

Subclass.prototype.animationsは、たとえば、プロトタイプにあり、すべてのさらなるインスタンスでSubclassが共有されています。あなたのコードから、各インスタンスに対してこれらのanimationsが新たに作成されることを意図したようです。

この問題を解決するにはどうすればよいですか?コンストラクタ関数をまったく使用しないでください。オブジェクトリテラルとObject.createを使用します。

var Node = { 
    init: function() { this.animations = []; }, 
    doSomething: function() { console.log(this.animations); } 
}; 

var GameObject = Object.create(Node); 
GameObject.doSomethingElse = function() { this.init(); this.doSomething(); } 

インスタンス化あなたが継承同じ方法:

​​

それはそれよりも難しいことではありません。

Combining inheritance with the module patternを参照してください。

+0

ちょっといいですね、私は別の 'init'メソッドを持つというこの考えが好きです。ありがとう! – Jem

+0

あなたはようこそ! – katspaugh

+0

だから...ただコンストラクタを使用しないでください?これは問題を解決する良い方法ではありません。正しい方法は、継承を設定するだけで親のコンストラクタを呼び出すことを伴わない別の手法を使用することです。http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html –

1

私の理解では、JavaScriptはC++、Java、C#などの伝統的な言語と同じ方法でクラスを実装しているわけではありません。私はあなたがJavaのようなランゲージで使用していた振る舞いを強制するJavaScriptフレームワークを使って、あなたが望む振る舞いを得ることができると思います。それ自体は、あなたが間違って何もしていないhttp://mootools.net

+0

感謝する正しい方法を示し

function GameObject() { // Call the parent's constructor Node.call(this); } 

は、私は例を使用してjsfiddleを更新したサブクラスから親クラスのコンストラクタを呼び出すことを確認する必要がありますあなたの情報のために、私はこれを見ている! – Jem

2

武ツールは、そのようなフレームワークです。これは、あなたのコードで予想される動作です。ただし、"Simple JavaScript Inheritence" by John Resigに記載されている方法と同様の方法を使用できます。同様のアプローチの別の考察は、here on stackoverflowで見つけることができます。

+0

ねえ、ありがとう、私はそれを見ているよ! – Jem

+0

継承をセットアップするために親のコンストラクタを呼び出すことは**間違っています –

1

継承チェーンを設定するだけで、親のコンストラクタを呼び出す必要はありません。http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html

次は悪いです参照してください、より良い方法は、「スーパークラス」をインスタンス化せずにプロトタイプを付ける代理コンストラクタを使用することで、プロトタイプチェーン

だけでセットアップに親のコンストラクタを実行します。

// Surrogate constructor 
var TempCtor = function(){}; 
TempCtor.prototype = Node.prototype; 
// Setup the prototype chain without side effects 
GameObject.prototype = new tempCtor(); 
GameObject.prototype.constructor=GameObject; 

は、あなたは、セットアップの継承http://jsfiddle.net/2caTD/5/

関連する問題