是否有任何理由将方法附加到单个实例 数组可能是不可取的?
我团队中的每个人似乎都同意这很好:
function communicate() {
console.log(this.sound);
}
var maru = {name: 'Maru', sound: 'prrrrrr'};
var garfield = {name: 'Garfield', sound: 'Anyone up for lasagna?'};
maru.talk = garfield.talk = communicate;
总是可以选择制作正式的构造函数,但是 如果你只需要一只猫,那么你就不必费心了。
这对我的团队来说有点争议:
function socialize() {
this.forEach(function(creature) {
creature.talk();
});
}
var cats = [garfield, maru];
cats.meowfest = socialize;
cats.meowfest();
//=> prrrrrr
//=> Anyone up for lasagna?
我团队的其他开发人员坚持认为我们必须将Array子类化而不是 即时添加方法。对我而言,它似乎是同样的基础 原理如第一个例子。总有选择做一个 正式的构造函数,但如果你只需要一个猫数组,那就太好了 你不必费心。我错了吗?
到目前为止,我只听到两个反对它的论点:
这不是猴子补丁。我实际上同意猴子修补通常 一个不好的做法,但在这种情况下,你不会影响原型 所有。您修改了一个实例,而不是原型。这是一个证据:
var arr1 = [];
arr1.foo = function() {return 'bar'};
arr1.foo(); // 'bar'
var arr2 = [];
arr2.foo(); // undefined is not a function
将方法添加到arr1
非常安全且不会影响arr2
一点都不。
无论如何你都不在数组上使用for-in,for-in用于对象 并返回键。对于数组,它只会将整数0返回到 长度。相反,你只需使用forEach,它可以正常工作。
var letters = ['a', 'b', 'c'];
letters.foo = function() {return 'bar'};
for (key in letters) {
console.log(key);
}
//=> '0'
//=> '1'
//=> '2'
//=> 'foo'
letters.forEach(function(letter) {
console.log(letter);
});
//=> 'a'
//=> 'b'
//=> 'c'
在我们添加之前,for-in的输出并不是特别有用 方法。我实际上喜欢它记录方法名称,这对我来说 看似很好的直觉行为。而且,forEach的输出是 不受影响,这正是我想要的。
那么社区如何将方法添加到数组中呢? 在最靠谱?我们是赞成还是反对?
答案 0 :(得分:1)
是的,它完全没问题。数组是对象,因此您可以向它们添加任意属性。
确实可能会破坏一些使用for...in
循环迭代数组的代码。为避免这种情况,您可以将属性定义为不可枚举:
Object.defineProperty(cats, 'meowfest', {
configurable: true,
writable: true,
value: socialize
});