15

違いは何ですか

Employee.prototype = Object.create(Person.prototype);

_.extend(Employee.prototype, Person.prototype);

どちらも同様の結果 (出力) を与えますが、アンダースコア メソッドは Person.prototype を Employee.constructor.prototype に追加しているように見えます。

純粋なJS

ここに画像の説明を入力

アンダースコアJS

ここに画像の説明を入力

の良い副作用は、_.extend多重継承を簡単にできることです: プロトタイプ チェーンも長くなりません ...

_.extend(Employee.prototype, Person.prototype);
_.extend(Employee.prototype, {
    doSomething: function() {
        return "hi ...";
    }
});

しかし ...

ここに画像の説明を入力

sayHi 関数と doSomething 関数が 2 つあるのはなぜですか? (実際には、1回だけ延長しても同じです)。

http://jsfiddle.net/VMqSy/1/

4

1 に答える 1

19

あなたEmployee.prototype = Object.create(Person.prototype);と完全に交換していEmployee.prototypeます。

しかし、あなたは の上に_.extend(Employee.prototype, Person.prototype);を追加しています。Person.prototypeEmployee.prototype

例えば、

var a = {var1:1, var2:2};
var b = {var2:4, var3:3};
console.log(_.extend(a, b)); // {var1:1, var2:4, var3:3}

ご覧aのとおり、 に完全に置き換えられたわけではなく、 で定義されたプロパティによって拡張bされただけです。b

于 2012-12-05T14:03:38.193 に答える