JavaScriptで原型継承
-
23-08-2019 - |
質問
私はYUI劇場でダグラス・クロックフォードの会談を見てきた、と私はJavaScriptの継承について質問があります...
ダグラスは「Hoozit」は「ギズモ」から継承することを示すために、この例を示します
function Hoozit(id) {
this.id = id;
}
Hoozit.prototype = new Gizmo();
Hoozit.prototype.test = function (id) {
return this.id === id;
};
なぜ彼はHoozit.prototype = new Gizmo()
代わりのHoozit.prototype = Gizmo.prototype
を書くのですか?
この二つの間に違いはありますか?
解決
理由はHoozit.prototype = Gizmo.prototype
を使用してHoozitのプロトタイプオブジェクトを変更することも振る舞いを期待されていないタイプギズモのオブジェクトを修正することを意味するであろうということです。
Hoozit.prototype = new Gizmo()
がgizmoから継承し、その後、一人でギズモを残しています。
他のヒント
他の回答には、この問題に対処していますが、プロトタイプを継承させたいならば、あなたはいくつかの寄生魔法を使うことができます:
Object.prototype.inherit = function(p) {
NewObj = function(){};
NewObj.prototype = p;
return new NewObj();
};
// Paraphrasing of Nicholas Zakas's Prototype Inheritance helper
function inheritPrototype(subType, superType) {
var prototype = Object.inherit(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
};
今、あなたは置き換えることができます:
Hoozit.prototype = new Gizmo();
タグ付き
inheritPrototype(Hoozit, Gizmo);
あなたは本当の大きなギズモのコンストラクタを持っていない限り、それはトラブルの価値はないかもしれません(私の提案で唯一の勝利はあなたがプロトタイプをフックするギズモのコンストラクタを呼び出す必要がないということです)。私はの TDD JavaScriptの例 の
彼はHoozit.prototype = Gizmo.prototypeを書き込むと
彼は後にHoozitのプロトタイプになります任意の変更は、ギズモのプロトタイプに反映されます。
トリプティクの回答に加えて:Hoozitの場合も、プロトタイプで定義されたものだけではなく、ギズモのすべてのインスタンスのプロパティを継承します。例えばます:
function Gizmo() {
this.foo = 'bar'; // foo is visible in every Hoozit instance
}
所属していません StackOverflow