1

ある種の古典的な継承を JavaScript に強制しようとする人々のやり方には、いつも驚かされます。オブジェクト b からオブジェクト a にプロトタイプ メソッドを追加せずに、あるオブジェクト b でオブジェクト a からプロトタイプ メソッドを継承するメソッドと、1から継承されたオブジェクトからプライベート変数を使用する可能性を設計しました。さて、私は興味があります: これは本当にプロトタイプの「継承」だと思いますか? それは実行可能な方法ですか?それに落とし穴はありますか?

コード例を次に示します。

Object.prototype.inheritsFrom = function(obj){
    var prototo   = this.prototype, 
        protofrom = obj.prototype;
    for (var l in protofrom) {
        if (protofrom.hasOwnProperty(l)){
            prototo[l] = protofrom[l];
        }
    }
}

function Obj1(){
    var const1 = 25;
    if (!Obj1.prototype.getConst1){
       Obj1.prototype.getConst1 = function(){
           return const1;
       }
    }
}

function Obj2(){
    var const2 = 50;
    if (!Obj2.prototype.getConst2){
       Obj2.prototype.getConst2 = function(){
           return const2;
       }
    }
    Obj2.inheritsFrom(Obj1);
}

var instanceA = new Obj1,
    instanceB = new Obj2;

この jsfiddleでわかるように、今instanceAは methodgetConst1instanceB含まれており、メソッドgetConst1とが含まれています。getConst2

1コンストラクター関数にプロトタイプ メソッド割り当てることにより、それによって作成されたクロージャーを効果的に使用します。

4

1 に答える 1

3

いいえ、それは典型的な継承ではありません。真のプロトタイプ継承では、プロトタイプへの変更は、そのプロトタイプに依存するオブジェクトに表示されます。あなたの例では、コピーされているだけなので、そうではありません。

状況によっては、これが別の有用な継承形式ではない可能性があると言っているわけではありませんが、典型的なものではありません。ある意味では、それが継承であるかどうかさえわかりませんが、どちらの方法でも議論できると思いますが、それは関係なく実際には問題ではありません。

プロトタイプに追加する例を次に示します。

function Parent() {
}
Parent.prototype.foo = function() {
  display("foo!");
};

function Child() {
}
Child.prototype = new Parent();

var c = new Child();

display("[before] typeof c.foo === '" + typeof c.foo + "'");
// shows "[before] typeof c.foo === 'function'"
display("[before] typeof c.bar === '" + typeof c.bar + "'");
// shows "[before] typeof c.bar === 'undefined'"
display("Note that c.bar is currently undefined");

Parent.prototype.bar = function() {
  display("bar!");
};

display("[after] typeof c.bar === '" + typeof c.bar + "'");
// shows "[after] typeof c.bar === 'function'"
display("Now c.bar is a function");

c.foo();
c.bar();

ライブコピー

これはあいまいなケースではないことに注意してください。結局のところ、あなた自身のコードは、それからすでに派生してObject.prototypeいる他のもの(Function)に反映されるように変更することに依存しています。


オフトピック:に何も追加しないことを強くObject.prototypeお勧めします。for..inで使用してもプロパティが生成されないと想定する大量のコードが破損し{}ます。追加を列挙不可能として確実にマークできるようになるまで(ECMAScript5はこれを行う方法を提供しますが、ほとんどの実装にはまだありません)、から離れてObject.prototypeください。ただの推薦。inheritsFromさらに、あなたの場合、インスタンスに対してのみ機能するため、意味がありません。代わりFunctionに追加することをお勧めしますFunction.prototype(これははるかに危険性が低くなります)。

于 2011-05-04T08:50:50.707 に答える