这些天我看到了很多这样的事情:
function Dog () {
this.name = 'Fido';
}
_.extend(Dog.prototype, {
bark: function() {
return 'BARK, BARK!'
},
soilChothingWithDirtyPaws: function () {
// Some intricated logic here
return 'There, I did it!';
}
});
但结果与下面的代码有什么不同?
function Dog () {
this.name = 'Fido';
}
Dog.prototype = {
bark: function() {
return 'BARK, BARK!'
},
soilChothingWithDirtyPaws: function () {
// Some intricated logic here
return 'There, I did it!';
}
}
我知道下划线的extend函数应该做什么,但我真的没有在对象的原型中做到这一点 - 当你可以用普通的老香草JS做到这一点,这意味着,我不明白为什么这里需要一个中间人。 我想知道我是否遗漏了一些非常整洁的东西。
这会带来什么好处吗?
如果有人清楚的话,那将是非常好的。非常感谢!答案 0 :(得分:6)
_.extend
的定义如下,
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
if (source) {
for (var prop in source) {
obj[prop] = source[prop];
}
}
});
return obj;
};
所有这一切都是,从索引1的参数到结尾遍历所有元素的属性,并将其添加到传递给它的第一个参数。
因此,从技术上讲,你所做的事情会产生同样的效果,但会产生一些微妙的差异。
当你使用_.extend
时,你正在扩充Dog.prototype
对象,当你分配它时(就像在你的第二个例子中),你正在用其他对象替换Dog.prototype
对象