次の行を追加する必要がある理由を誰かが理解するのを手伝ってくれるかどうか疑問に思っています...
if (!obj.hasOwnProperty(key)) continue;
...次の方法で:
extend: function(obj) {
// shallow copy
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
this[key] = obj[key];
}
}
次の行を追加する必要がある理由を誰かが理解するのを手伝ってくれるかどうか疑問に思っています...
if (!obj.hasOwnProperty(key)) continue;
...次の方法で:
extend: function(obj) {
// shallow copy
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
this[key] = obj[key];
}
}
を使用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
継承し、 が作成されたときに設定されます。しかし、関数はそれらを除外するために使用するため、作成するコピーにそれらをコピーせず、それらは に存在しません。それはオブジェクトに直接割り当てられているため、プロトタイプからではなく、他のものはプロトタイプから取得されるため、コピーされません。infoForAllThings
speak
Thing.prototype
t1
extend
hasOwnProperty
t2
t2
name