2011-12-01 91 views
3

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

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请求也调用原型方法(因为它们引用了用于事件处理的函数)。

这是什么其他副作用?我知道它(obj中的var x)失败,但大多数情况下我们可以使用obj.hasOwnProperty,这应该有帮助吗?

回答

1

你只是不想与主机或本地对象原型混乱无不良影响(虽然在Array.prototype)。

  • 你无法知道它有任何第三方脚本副作用
  • 如果有那么一天被本地创建
这些方法,您可能会混淆第三方代码
  • 你不知道

    整体,延伸Object.prototype效果任何整个网站上的其他对象。再说一遍,你只是不想这样做,除非你处在这样一个沙盒环境中,每一个ecmascript都是自己编写的,而且你100%肯定没有第三方脚本被加载。

  • 2

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

    这是唯一的主要陷阱,.hasOwnProperty()帮助,但只在你自己的代码。例如,在jQuery中,他们采取了而不是$.each()方法中调用.hasOwnProperty

    我在我自己的代码中使用Object.defineProperty(...),以绕过枚举财产问题

    +0

    为什么jQuery作者决定不调用.hasOwnProperty,具体原因是什么?它肯定会尝试调用我的事件处理程序并通知更改,但是我确实通过检查参数来获得解决方法。 –