コードが記述されると、new Human()
を使用して作成されたオブジェクトの値は、Primate
関数への参照であるprototype
と呼ばれるプロパティになります。それは明らかにあなたが望むものではありません(それは特別ではありません)。
いくつかのこと:
あなたは通常(new
オペレーター付き)コンストラクタとして使用されることを意図しています機能のprototype
を変更したいです。つまり、Human
にprototype
を設定する(のインスタンスはHuman
ではありません)。
もしprototype
に割り当てる値がインスタンス所望のタイプのなければならない(または、全くの初期化作業が必要ない場合には、所望のタイプのprototype
)コンストラクタへ、ない参照。
Object
(またはObject
インスタンス)を関数のprototype
に明示的に割り当てる必要はありません。これは暗黙的です。
function Primate() {
this.hairy = true;
}
function Human() {}
Human.prototype = new Primate();
Human.prototype.constructor = Human;
var h = new Human();
がh
によって参照Human
が値trueでhairy
というプロパティを持っています
はおそらくもっとこのような何かをしたいです。前の例で
は、hairy
はPrimate
がHuman.prototype
はPrimate
のインスタンスを割り当てなければならない理由である、呼び出される一度だけその値が割り当てられます。代わりに、このような初期化が必要ないように記述することもできます。
例:
function Primate() {}
Primate.prototype.hairy = true;
function Human() {}
Human.prototype = Primate.prototype;
Human.prototype.constructor = Human;
var h = new Human();
あなたがjsの中に、この理解するための継承を読まなければならない:http://javascript.crockford.com/inheritance.htmlとhttp://javascript.crockford.com/prototypal.html – bfavaretto
あなたはそれを間違っている。 'Primate'と' Human'のコンストラクタの 'prototype'オブジェクトを操作したいとします。新しく作成されたインスタンス(コンストラクタ内の 'this'値)は関数ではないため、' prototype'プロパティを追加するのは無意味です。 –
プロトタイプチェーンにパッチを当てるのではなく、Object.createを使ってオブジェクトを作成して拡張します。コンストラクタとして関数を使用すると、JavaScriptオブジェクトをクラスのような構造として実装しているため、混乱を招く可能性があります。 – rxgx