JavaScript对象包含继承属性

时间:2009-11-20 15:06:58

标签: javascript

当我尝试使用以下方法创建JavaScript对象时,我有一个网页:

var myVar = {};

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

2 个答案:

答案 0 :(得分:5)

有人走了,在Object.prototype上放了一些东西。自己检查一下:

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

至于跟踪它,使用上面的输出来搜索你的代码库。要检查的第一个地方是<script src="..."></script>标记中包含的任何外部库。例如,Prototype库的旧版本增加了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)) {
        /* ... */
      }
    }
    

    当然,在进入代码库的所有未来hasOwnProperty代码中使用for..in时一定要明智。

  3. 您可以同时清理代码库,以防止其他库输入自己更改Object.prototype的代码。

答案 1 :(得分:0)

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