JavaScript对象包含继承属性

Ahm*_*mad 1 javascript

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

var myVar = {};

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

Cre*_*esh 5

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

for(var k in {}) alert(k); // should get NO alerts
Run Code Online (Sandbox Code Playgroud)

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

更新@Ahmad的评论:

你有两个选择:

  1. 将实现移原型,而不是将事物作为第一个参数进行扩展,例如:

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

    并重构所有做的地方:

    foo.inherit(a, b)
    
    Run Code Online (Sandbox Code Playgroud)

    改为做:

    Object.inherit(foo, a, b)
    
    Run Code Online (Sandbox Code Playgroud)

    这种方法显然可能需要大量的重新分解工作.好处是你Object.prototype独自离开.

  2. 第二种方法是保留Object.prototype.inherit = ...单独执行的代码,而是重构您正在尝试编写的代码以使用hasOwnProperty,这将告诉您是否已直接在对象上设置属性(即,不会跋涉对象的原型链):

    for(var k in myVar) {
      if (myVar.hasOwnProperty(k)) {
        /* ... */
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    当然,hasOwnProperty在将来for..in进入代码库的所有代码中使用都是明智的.

您可以同时执行这两项操作来清理代码库,并且可以防止其他库进入可以改变Object.prototype自身的代码.