0

次の行を追加する必要がある理由を誰かが理解するのを手伝ってくれるかどうか疑問に思っています...

if (!obj.hasOwnProperty(key)) continue;

...次の方法で:

extend: function(obj) {
  // shallow copy
  for (var key in obj) {
    if (!obj.hasOwnProperty(key)) continue;
      this[key] = obj[key];
  }
}
4

1 に答える 1

2

を使用for-inしてオブジェクトのプロパティの名前をループすると、オブジェクトがそのプロトタイプから継承するものを含め、列挙可能なすべてのプロパティが表示されます。そのメソッドを実装している人は、プロトタイプから継承されたプロパティをコピーしたくなく、オブジェクト自体が直接所有するものだけを含めたようです。

次に例を示します。

function Thing(name) {
    this.name = name;
}
Thing.prototype.speak = function() {
    console.log("I'm " + this.name);
};
Thing.prototype.infoForAllThings = 42;
var t1 = new Thing("Fred");
console.log(t1.name);             // "Fred"
console.log(t1.infoForAllThings); // "42"
t1.speak();                       // "I'm Fred"
var t2 = extend(t1);              // (Where `extend` is like your function,
                                  // but returns the object rather than using `this`
console.log(t2.name);             // "Fred"
console.log(t2.infoForAllThings); // "undefined"
t2.speak();                       // Error

上記では、はそのプロトタイプからおよびプロパティをt1継承し、 が作成されたときに設定されます。しかし、関数はそれらを除外するために使用するため、作成するコピーにそれらをコピーせず、それらは に存在しません。それはオブジェクトに直接割り当てられているため、プロトタイプからではなく、他のものはプロトタイプから取得されるため、コピーされません。infoForAllThingsspeakThing.prototypet1extendhasOwnPropertyt2t2name

于 2013-04-12T15:18:16.570 に答える