【问题标题】:rename hasOwnProperty but prevent enumeration重命名 hasOwnProperty 但阻止枚举
【发布时间】:2011-11-09 09:34:11
【问题描述】:

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

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

【问题讨论】:

    标签: javascript enumeration prototype-programming


    【解决方案1】:

    您只能在 ES5 兼容的浏览器中阻止枚举,使用 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 运算符的歧义。

    【讨论】:

    • 谢谢。我之前尝试过使用defineProperty,但我想我用错了
    【解决方案2】:

    这应该可以解决问题

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

    小心使用 SomeNativeThing.prototype 并使用

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

    以确保您不会覆盖任何东西

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

    【讨论】:

    • 为什么不Object.prototype.has = Object.prototype.hasOwnProperty;
    • 旁注:不要扩展 Object.prototype。改为扩展 myObject.prototype
    • 呃,你忽略了我问题的重要部分“......但防止枚举”。我已经尝试过 pomeh 的方法,但是我的 for..in 循环中出现错误,因为“has”在每个基本对象上都显示为可枚举。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多