重命名hasOwnProperty但阻止枚举

时间:2011-11-09 09:34:12

标签: javascript enumeration prototype-programming

我不得不在我的代码中使用hasOwnProperty,并且它很长并且可以打字。我希望能够只说myObj.has('x'),但当我尝试在Object.prototype中为hOP创建别名时,'has'现在在for..in循环中被枚举。得到我想要的最好的方法是什么?我的意思是我可以创建一个像has(obj, prop)一样的全局函数,但我更喜欢点格式,我想知道javascript可能有什么技巧,所以我正在寻找建议。

更新:这看起来非常h​​acky但是String.prototype.in = function(obj){return obj.hasOwnProperty(this)}好吗?然后,我可以说if ( 'x'.in(myObj) ) {...不幸的是,它增加了另一层函数调用,而不仅仅是别名hasOwnProperty,但我喜欢语法。

2 个答案:

答案 0 :(得分:3)

您只能使用Object.defineProperty()

阻止兼容ES5的浏览器中的枚举
Object.defineProperty(myObj, "has", { value: Object.prototype.hasOwnProperty });

defineProperty()默认设置不可枚举的属性。更好的ES3方法是对函数进行别名,而不是将其粘贴在Object.prototype

var has = function (ob, prop) { 
    return Object.prototype.hasOwnProperty.call(ob, prop); 
}

我认为你自己的String.prototype.in方法没有任何问题,除了将来潜在的命名冲突,但那是你的号召。调用String.prototype.on可以消除in运算符的歧义。

答案 1 :(得分:1)

这应该可以解决问题

Object.prototype.has = function(x) {
  return this.hasOwnProperty(x)
}

使用SomeNativeThing.prototype时要小心并使用

if ((typeof Object.prototype.has) !== 'function') {
   ...
}

确保您不会覆盖任何内容

正如@pomeh所述,使用Object.prototype.has = Object.prototype.hasOwnProperty更好