什么是扩展Object.prototype的陷阱?

时间:2011-12-01 12:08:32

标签: javascript object prototype-programming

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

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

2 个答案:

答案 0 :(得分:2)

  

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

这是唯一的主要陷阱,.hasOwnProperty()会有所帮助,但仅限于您自己的代码。例如,在jQuery中,他们已经采取了明确的决定而不是来调用.hasOwnProperty方法中的$.each()

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

答案 1 :(得分:1)

你只是不想搞乱来自主机或本机对象的原型。

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

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