2012-06-30 4 views
5

JavaScriptのコードでAnimalクラスのプロトタイプを継承できないのはなぜですか?私は<code>Animal</code>クラスから継承プロトタイプを経て継承する新しいクラス<code>Dog</code>作成しようとしています

function Animal() { 
    this.name = "animal"; 
    this.writeName = function() { 
    document.write(this.name); 
    }  
} 

function Dog() { 
    this.name = "dog"; 
    this.prototype = new Animal(); 
} 

new Dog().writeName() 

JS Fiddle

はしかし、私は、Javascriptのエラーを取得:Uncaught TypeError: Object #<Dog> has no method 'say'

なぜですか? Dogオブジェクトは、Animalオブジェクトをプロトタイプとして保持してはいけませんか?

+0

正しいコードを貼り付けてもよろしいですか? 「言う」という言葉は一度そこに現れません。 –

+0

クラスがないので? ;)しかし、問題は、 ''これは既に間違ったオブジェクト*であることです(また、 ''プロトタイプ ''が新しいものを利用するには遅すぎます)。 –

+2

ところで、document.writeの代わりにconsole.logを使用し、警告してください。長期的にはあなたの人生をはるかに容易にします。 – hugomg

答えて

3

はもちろん、正しいですが、彼は本当には何それについてさまざまだと、それは初心者に明確ではないかもしれない、そう...

言っていません。あなたが作っている間違いはthis.prototype = new Animal();は(thisによって参照)、現在のDogインスタンスprototypeという名前のプロパティにAnimalインスタンスを割り当てることですが、という名前のプロパティについて何も特別なことはありませんこのコンテキストでは3210です。

prototypeプロパティは、関数オブジェクトでのみ魔法です。 SomeFuncの新しいインスタンスを作成するときに、new SomeFunc()を使用すると、新しいオブジェクトの内部/隠し[[prototype]]ポインタは、SomeFunc.prototypeが指すオブジェクトを参照します。 prototypeの名前は他の文脈では特別ではありません。

+1

彼はそれを明確にするために、おかげさまで急いでいました。 – Ryan

2

"prototype"プロパティは単なる通常のプロパティです。委譲を扱う実際の[[Proto]]プロパティは隠されており、オブジェクトが作成された後は直接操作することはできません(Firefoxではいくつかの拡張子を除いて:__proto__プロパティ)。

function Animal() { 
    this.name = "animal"; 
    this.writeName = function() { 
    document.write(this.name); 
    }  
} 

function Dog() { 
    var dog = Object.create(new Animal()) 
    dog.name = "dog"; 
    return dog; 
} 

(new Dog()).writeName() 

より慣用的な例でしょう:あなたがやっていることへの精神が似ている

正しいJavascriptの継承の例は、正しい[[プロトタイプ]]プロパティで犬を作成するためにObject.createを使用します私は犬のプロトタイプをインスタンス化するためにnew Animalの代わりにObject.createを使用することをお勧めしますが、あなたがやっているように手動でコンストラクタにアタッチするのではなく、別の動物プロトタイプに動物メソッドを入れます。

+0

@pst: "prototype"プロパティが特別な振舞いを期待していたことについて、私は話していました。 – hugomg

+0

これはいいですよ、+1 :-)第3版では 'Object.create(proto)'がネイティブで入手できますか? –

+0

@pst:私は覚えていませんが、使用できないときにはpolyfillを書くのはとても簡単です:https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Object/create#Polyfill – hugomg

7
function Animal() { 
    this.name = "animal"; 
    this.writeName = function() { 
    document.write(this.name); 
    }  
} 

function Dog() { 
    this.name = "dog"; 

} 
Dog.prototype = new Animal(); 
dog = new Dog(); 
dog.writeName(); 

今、犬は動物のすべての特性を持っています。ライアンの答え@

jsfiddle

関連する問題