私はJavaScriptのプロトタイプの振る舞いを研究していて、私を混乱させる多くの異なる使用法を見ています。次のコンストラクター関数とプロトタイプ定義があるとしましょう。
function Mammal(name) {
this.name = name;
}
Mammal.prototype.says = function ( ) {
return this.saying || '';
};
Mammal.prototype.getName = function ( ) {
return this.name;
};
function Cat(name) {
this.name = name; //another maybe better way could be Mammal.call(this, name); results in the same
this.saying = "meow";
}
Cat.prototype = new Mammal();
Cat.prototype.purr = function() {
return "rrrrrrr";
};
この種の例はウェブや本でよく見かけますが、これが適切な方法であるとは思えません。私が抱えている最初の問題は、Mammalコンストラクターが引数なしで呼び出されることです(これは現時点では明らかに不明です)。その結果、新しく構築されたMammalオブジェクトのnameプロパティは未定義です(下の画像を参照)。
私の意見では、このプロパティは使用されておらず、オブジェクトモデルを汚染しているため、存在するべきではありません。
私の質問:JavaScriptのプロトタイプの動作の一部を説明するためによく使用される上記の例は、これを行うための受け入れられた方法ですか、それとも次のことを行うことが望ましいですか?
Cat.prototype = Object.create(Mammal.prototype);
この負担から解放してください。前もって感謝します。