Javascript 扩展Object.prototype的陷阱是什么?
我想扩展Object.prototype,通过UI框架基本上支持JSON数据和html元素中的通知Javascript 扩展Object.prototype的陷阱是什么?,javascript,object,prototype-programming,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
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);
};
然而,基于这个问题和其他一些问题,人们说我们应该避免扩展Object.prototype,而不是任何其他类型
例如,如果我不这样做,我的代码就会变得更大
window.myModel.setValue("currentStatus","empty");
必须这样写
Binder.setValue(window.myModel,"currentStatus","empty");
我想知道如果我使用这些方法会出现什么问题?它是否会导致jQuery出现意外行为?我曾经看到,jQuery的ajax请求也会调用原型方法(因为它们引用了用于事件处理的函数)
这还有什么副作用?我知道它对(obj中的var x)是失败的,但大多数情况下我们可以使用obj.hasOwnProperty,这应该会有帮助吧
我知道(obj中的var x)的会失败,但大多数情况下我们可以使用obj.hasOwnProperty
,这应该会有帮助吧
这是唯一的主要陷阱,.hasOwnProperty()
有帮助,但只有在您自己的代码中。例如,在jQuery中,他们故意决定不在$.each()
方法中调用.hasOwnProperty
我在自己的代码中使用了Object.defineProperty(…)
,以避开可枚举属性问题,而不会产生任何不良影响(尽管对Array.prototype
)您只是不想弄乱主机或本机对象的原型
- 您无法知道它对任何第三方脚本有哪些副作用
- 您可能会混淆第三方代码
- 你不知道这些方法是否有一天是本机创建的
总体而言,扩展对象。原型影响整个站点上的任何其他对象。同样,您也不想这样做,除非您处于这样一个沙盒环境中,ecmascript的每一部分都是自己编写的,并且您100%确定没有加载任何第三方脚本。为什么jQuery作者决定不调用.hasOwnProperty,有什么具体原因吗?它确实尝试调用我的事件处理程序并通知更改,但我确实通过检查参数找到了解决方法。