質問

私は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
}
scroll top