2009-11-20 115 views
1

我有一个网页,当我尝试使用它创建一个JavaScript对象时:JavaScript对象包含继承属性

var myVar = {};

生成的对象总是包含一个继承属性,这会干扰我的代码,除非在此页面上才会发生,任何人都知道为什么?

回答

5

有人完成了,并在Object.prototype把事端。自己检查:

for(var k in {}) alert(k); // should get NO alerts 

至于跟踪它,使用上面的输出来搜索您的代码库。首先要检查的地方是你在<script src="..."></script>标签中包含的任何外部库。例如原型库的真正旧版本增加了Object.prototype

更新再评论从@Ahmad

你有两个选择:

  1. 移动实施关闭原型,而不是把事情扩大作为第一个参数,例如: :

    Object.inherit = function(obj, superClass, superClassName) { 
        /* change "this" to "obj" all throughout the code here */ 
    } 
    

    和重构全部地方是这样做:

    foo.inherit(a, b) 
    

    ,而不是做:

    Object.inherit(foo, a, b) 
    

    这种方法可能需要大量重新分解的努力效果显着。你的好处是你只留下Object.prototype

  2. 的第二个办法是离开单独做Object.prototype.inherit = ...的代码,而不是重构你想现在就写使用hasOwnProperty,它会告诉你,如果一个属性被直接设置在对象上的代码(即没有通过对象的原型链跋涉):

    for(var k in myVar) { 
        if (myVar.hasOwnProperty(k)) { 
        /* ... */ 
        } 
    } 
    

    当然是在进入该代码库所有未来for..in代码使用hasOwnProperty明智。

你可以做到既清理你的代码是针对输入改变Object.prototype自己的代码库等面向未来的。

+0

@Ahmad:有没有图书馆有错?好奇.... – 2009-11-20 15:30:42

+0

它不是一个库故障,有一个js文件,它将继承函数添加到Object原型,如下所示: Object.prototype.inherit = function(superClass,superClassName) { ... }; 你知道如何解决这个问题,而不删除上述?因为它在页面的其他部分需要 – Ahmad 2009-11-20 15:41:04

+0

@Ahmad:看到我的更新 – 2009-11-20 15:58:20

0

也许您正在包含的某些脚本正在修改Object.prototype以添加自己的自定义函数。