Javascript:在for循环中隐藏原型方法?

Nic*_*ina 45 javascript arrays loops for-loop prototype

所以我想说我已经在Array类中添加了一些原型方法:



Array.prototype.containsKey = function(obj) {
    for(var key in this)
        if (key == obj) return true;
    return false;
}

Array.prototype.containsValue = function(obj) {
    for(var key in this)
        if (this[key] == obj) return true;
    return false;
}

Run Code Online (Sandbox Code Playgroud)

然后我创建一个关联数组并尝试循环它的键:



var arr = new Array();
arr['One'] = 1;
arr['Two'] = 2;
arr['Three'] = 3;

for(var key in arr)
   alert(key);

Run Code Online (Sandbox Code Playgroud)

这会返回五个项目:

  -One
  -Two
  -Three
  -containsKey
  -containsValue

但我想(期待?)只有三个.我接近这个错吗?有没有办法"隐藏"原型方法?或者我应该采取不同的做法?

abb*_*bbr 51

通过使原型方法不可枚举,您可以从另一端获得所需的结果:

Object.defineProperty(Array.prototype, "containsKey", {
  enumerable: false,
  value: function(obj) {
      for(var key in this)
        if (key == obj) return true;
      return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您可以控制方法定义,这通常会更好,特别是如果您无法控制其他人如何调用您的代码,这是库代码开发中的常见假设.

  • 当您无法控制循环的代码时,这尤其有用. (3认同)
  • 这比在每个循环中检查hasOwnProperty要优雅得多.对于旧版浏览器,您可以使用自己的实现,例如:https://github.com/inexorabletash/polyfill/blob/master/es5.js#L71 (3认同)

Kir*_*tan 49

你可以使用JavaScript的hasOwnProperty方法在循环中实现这一点,如下所示:

for(var key in arr) {
    if (arr.hasOwnProperty(key)) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

参考:这个YUI博客文章.

  • 通过尝试创建一个较短版本的hasOwnProperty`Object.prototype.has = Object.prototype.hasOwnProperty,我遇到了这个问题. (13认同)