Javascript 重命名hasOwnProperty,但防止枚举

Javascript 重命名hasOwnProperty,但防止枚举,javascript,enumeration,prototype-programming,Javascript,Enumeration,Prototype Programming,我不得不在代码中大量使用hasOwnProperty,而且它很长,而且很难输入。我想说的是myObj.has('x'),但当我尝试在对象中为hOP创建别名时,prototype“has”现在在for..in循环中被枚举。得到我想要的东西的最好方法是什么?我的意思是我可以制作一个像has(obj,prop)那样工作的全局函数,但是我更喜欢点格式,我想知道javascript可能会有哪些技巧,所以我正在寻找建议 更新:这看起来很粗糙,但是String.prototype.in=function(ob

我不得不在代码中大量使用hasOwnProperty,而且它很长,而且很难输入。我想说的是
myObj.has('x')
,但当我尝试在对象中为hOP创建别名时,prototype“has”现在在for..in循环中被枚举。得到我想要的东西的最好方法是什么?我的意思是我可以制作一个像has(obj,prop)那样工作的全局函数,但是我更喜欢点格式,我想知道javascript可能会有哪些技巧,所以我正在寻找建议


更新:这看起来很粗糙,但是
String.prototype.in=function(obj){return obj.hasOwnProperty(this)}
可以吗?这样我就可以说if('x'){…,不幸的是,它增加了另一层函数调用,而不仅仅是别名hasOwnProperty,但我喜欢语法。

这应该可以做到

Object.prototype.has = function(x) {
  return this.hasOwnProperty(x)
}
使用SomeNativeThing.prototype和use时要小心

if ((typeof Object.prototype.has) !== 'function') {
   ...
}
以确保您的应用程序不会覆盖任何内容


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

您只能使用
Object.defineProperty()
在ES5兼容的浏览器中防止枚举:

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

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

我看不出您自己的
String.prototype.in
方法有任何问题,除了将来可能发生的命名冲突,但这是您的要求。调用
String.prototype.on
将消除
in
操作符中
的歧义。

为什么不
Object.prototype.has=Object.prototype.hasOwnProperty?旁注:不要扩展Object.prototype.extend myObject.prototype,相反,你忽略了我问题中重要的一半“…但是防止枚举”。我已经尝试了pomeh的方法,但是我的for..in循环中出现错误,因为“has”在每个基本对象上都显示为可枚举。谢谢。我以前尝试过使用defineProperty,但我想我用错了
var has = function (ob, prop) { 
    return Object.prototype.hasOwnProperty.call(ob, prop); 
}