我不得不在我的代码中使用hasOwnProperty,并且它很长并且可以打字。我希望能够只说myObj.has('x')
,但当我尝试在Object.prototype中为hOP创建别名时,'has'现在在for..in循环中被枚举。得到我想要的最好的方法是什么?我的意思是我可以创建一个像has(obj, prop)
一样的全局函数,但我更喜欢点格式,我想知道javascript可能有什么技巧,所以我正在寻找建议。
更新:这看起来非常hacky但是String.prototype.in = function(obj){return obj.hasOwnProperty(this)}
好吗?然后,我可以说if ( 'x'.in(myObj) ) {...
不幸的是,它增加了另一层函数调用,而不仅仅是别名hasOwnProperty,但我喜欢语法。
答案 0 :(得分:3)
您只能使用Object.defineProperty()
:
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
更好