在javascript中将方法附加到单例数组是否可以?

时间:2015-06-13 21:05:35

标签: javascript arrays

是否有任何理由将方法附加到单个实例 数组可能是不可取的?

我团队中的每个人似乎都同意这很好:

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子类化而不是 即时添加方法。对我而言,它似乎是同样的基础 原理如第一个例子。总有选择做一个 正式的构造函数,但如果你只需要一个猫数组,那就太好了 你不必费心。我错了吗?

到目前为止,我只听到两个反对它的论点:

  1. 这是猴子修补和猴子修补是危险的。
  2. 这不是猴子补丁。我实际上同意猴子修补通常 一个不好的做法,但在这种情况下,你不会影响原型 所有。您修改了一个实例,而不是原型。这是一个证据:

    var arr1 = [];
    arr1.foo = function() {return 'bar'};
    arr1.foo(); // 'bar'
    
    var arr2 = [];
    arr2.foo(); // undefined is not a function
    

    将方法添加到arr1非常安全且不会影响arr2 一点都不。

    1. 它打破了。
    2. 无论如何你都不在数组上使用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的输出是 不受影响,这正是我想要的。

      那么社区如何将方法添加到数组中呢? 在最靠谱?我们是赞成还是反对?

1 个答案:

答案 0 :(得分:1)

是的,它完全没问题。数组是对象,因此您可以向它们添加任意属性。

确实可能会破坏一些使用for...in循环迭代数组的代码。为避免这种情况,您可以将属性定义为不可枚举:

Object.defineProperty(cats, 'meowfest', {
  configurable: true,
  writable: true,
  value: socialize
});