对象原型

时间:2013-10-30 14:29:38

标签: javascript prototype prototype-programming

在我的javascript代码中,我经常需要检查某个可枚举列表中的表达式是否为:

if ((a == 'value1') || (a == 'value2') || (a == 'value3')) { ... do smth ... }

我可以这样写:

if (['value1', 'value2', 'value3', 'value4'].indexOf ( a ) ) { ... do smth ... }

但我认为这是不可读的。

我为 Object.prototype 添加属性 in_arr

Object.defineProperty(Object.prototype, 'in_arr', {
    value : function(arr) {
                for (var i=0; i<arr.length; i++) {
                    if ( arr[i] == this.valueOf() ) {
                        return true;
                    }
                }
                return false;
             },
    enumerable: false
})

现在我可以这样写:

if (a.in_arr([ 'value1', 'value2', 'value3', 'value4' ]) { ... do smth ... }

我认为,它看起来不错。但我想问一下:像这样更改 Object.prototype 是否安全?性能怎么样?

4 个答案:

答案 0 :(得分:3)

创建一个枚举哈希,如下所示:

var enumHash = {
  value1: true,
  value2: true,
  value3: true
  // actually it doesn't matter which value to assign: 
  // even undefined will do, as you check the existence of a property, not its value
};

...然后只检查属性的存在:

if (someValue in enumHash) { ... }

这将比Array.indexOf更快,更具可读性。

答案 1 :(得分:0)

更改系统对象(如Array,Object等)的错误方法。如果有人进行此类更改,可能会发生冲突

答案 2 :(得分:0)

不建议扩展Object.prototype,这会导致奇怪的行为,如果像一个简单的函数那样危险性较低,就没有必要采取一种方式。

in_array(obj, [ 'a', 'b', 'c' ]);

您甚至可以创建一个utils对象

utils.in_array(obj, [ 'a', 'b', 'c' ]);

有一次我说过......

这与Extending Object.prototype JavaScript非常相似,我完全赞同Alex Wayne:

  

我认为如果它适用于你的目标环境就好了。

     

此外,我认为原型扩展偏执狂被夸大了。只要你像一个好的开发人员一样使用hasOwnProperty()就可以了。最糟糕的情况是,您在其他地方重载该属性并丢失该方法。但如果你这样做,那就是你自己的错。

答案 3 :(得分:-2)

您可以使用Array.prototype.indexOf(el)

[ 'value1', 'value2', 'value3', 'value4' ].indexOf(a.valueOf()) !== -1