【问题标题】:What are pitfalls of extending Object.prototype? [duplicate]扩展 Object.prototype 有什么陷阱? [复制]
【发布时间】:2012-01-10 14:02:15
【问题描述】:

我想扩展 Object.prototype,通过 UI 框架基本支持 JSON 数据和 html 元素中的通知。

Object.prototype.setValue = function(key,value){
   // this simply sets value as this[key] = value
   // and raises an event
   Binder.setValue(this,key,value);
};
Object.prototype.getValue = function(key){
   return Binder.getValue(this,key);
};

然而,基于这个问题,Extending Object.prototype JavaScript 和其他一些人,人们说我们应该避免扩展 Object.prototype,而是任何其他类型都可以。

如果我不这样做,那么我的代码就会变大,例如

window.myModel.setValue("currentStatus","empty");

必须写成,

Binder.setValue(window.myModel,"currentStatus","empty");

我想知道如果我使用这些方法会出现什么问题?它会导致 jQuery 出现意外行为吗?我曾经见过,jQuery 的 ajax 请求也会调用原型方法(因为它们引用了用于事件处理的函数)。

这还有什么其他副作用?我知道 for(var x in obj) 失败了,但大多数情况下我们可以使用 obj.hasOwnProperty,这应该有帮助吧?

【问题讨论】:

    标签: javascript object prototype-programming


    【解决方案1】:

    您只是不想弄乱主机或本机对象的原型。

    • 您无法知道它对任何第三方脚本有哪些副作用
    • 您可能会混淆第三方代码
    • 你不知道有一天这些方法是否会在本地创建

    总的来说,扩展Object.prototype 会影响整个站点上的任何其他对象。同样,您只是不想这样做,除非您处于这样一个沙盒环境中,并且每一段 ecmascript 都是您自己编写的,并且您 100% 确定没有加载任何第三方脚本。

    【讨论】:

      【解决方案2】:

      我知道它失败了for(var x in obj),但大多数情况下我们可以使用obj.hasOwnProperty,这应该有帮助吧?

      这是唯一的主要陷阱,.hasOwnProperty() 有帮助,但仅限于您自己的代码。例如,在 jQuery 中,他们故意$.each() 方法中调用.hasOwnProperty

      我在自己的代码中使用了Object.defineProperty(...) 来解决可枚举的属性问题而没有任何不良影响(尽管在Array.prototype 上)

      【讨论】:

      • 为什么jQuery作者决定不调用.hasOwnProperty,有什么具体原因吗?它确实会尝试调用我的事件处理程序并通知更改,但是我确实通过检查参数得到了解决方法。
      猜你喜欢
      • 2018-03-25
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多