8

Douglas Crockford の YUI シアターでの講演を見ていて、JavaScript の継承について質問があります...

Douglas は、「Hoozit」が「Gizmo」を継承していることを示すために、次の例を示しています。

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ですか?

これら2つに違いはありますか?

4

4 に答える 4

17

その理由は、使用Hoozit.prototype = Gizmo.prototypeすると、Hoozit のプロトタイプ オブジェクトを変更すると、Gizmo タイプのオブジェクトも変更されることになり、これは予期された動作ではないためです。

Hoozit.prototype = new Gizmo()ギズモから継承し、ギズモをそのままにします。

于 2008-12-23T16:48:33.823 に答える
3

他の回答はこれに対処しますが、プロトタイプを継承したい場合は、寄生魔法を使用できます。

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);

本当に大きな Gizmo コンストラクターを持っていない限り、苦労する価値はないかもしれません (私の提案での唯一の利点は、Gizmo のコンストラクターを呼び出してプロトタイプを接続する必要がないことです)。TDD JavaScript Examplesに、これらのタイプのパターンの多くの例があります。

于 2009-10-29T14:09:40.767 に答える
2

Hoozit.prototype = Gizmo.prototype と書くと、後で Hoozit のプロトタイプに加えた変更が Gizmo のプロトタイプに反映されます。

于 2008-12-23T16:49:44.353 に答える
2

Triptych の回答に加えて、Hoozit インスタンスは、プロトタイプで定義されたものだけでなく、Gizmo のすべてのインスタンス プロパティも継承します。例えば:

function Gizmo() {
    this.foo = 'bar'; // foo is visible in every Hoozit instance
}
于 2008-12-23T17:08:10.773 に答える