0

我的代码发生了一些奇怪的事情。我观察到的是这样的:

var prototype = {
    property : "",
    array : []
}

var objectArray = [];

function myFunction {
    objectArray[0] = Object.create(prototype);
    objectArray[1] = Object.create(prototype);

    objectArray[0].property = "Hello 1";
    objectArray[0].array.push("Hello 1");
    objectArray[1].property = "Hello 2";
    objectArray[1].array.push("Hello 2");

    // At this point when running the program I get:
    // objectArray[0].property == "Hello 1"
    // objectArray[1].property == "Hello 2";
    // objectArray[1].array == objectArray[1].array == prototype.array
    // == ["Hello 1", "Hello 2"]
}

我想要并且期望的是两个对象的两个单独的数组。我在这里想念什么?

4

4 回答 4

1

在 JavaScript 中,对象是通过引用复制的,所以两个objectArray对象只是对同一个对象的引用(prototype)。您需要使用new关键字和构造函数来克隆对象或创建实例以创建单独的对象。

有关如何使用new关键字执行此操作的示例:

var prototype = function() {
    this.property = "";
    this.array = [];
};

objectArray[0] = new prototype();
objectArray[1] = new prototype();

你也可以这样做:

var prototypeFactory = function() {
    return {
        property: "",
        array: []
    };
};

objectArray[0] = prototypeFactory();
objectArray[1] = prototypeFactory();
于 2012-11-27T12:47:59.433 回答
0

prototype对象与每个对象的存在相同[[Prototype]]。当您使用Object.create().

您需要使用赋值,它永远不会遍历原型链。

于 2012-11-27T12:48:00.957 回答
0

我想知道您是否没有问自己“为什么它适用于property,但不适用于array?”。事实是,这两者都不起作用property,JavaScript 正在愚弄你。

当对象共享相同的原型时,必须考虑:

  • 原型的所有属性都由从该原型继承的对象共享。
  • 您不能分配给原型的属性,只能读取它们(除非它是访问器属性,但让我们把它放在一边)。

那么这里实际发生了什么:

objectArray[0].property = "Hello 1";
objectArray[1].property = "Hello 2";

是在每个对象上创建一个名为“property”的新属性,而保持不变prototype.property。该array属性的行为不同,因为您没有分配给它,而是访问prototype.array并调用push它的方法。

于 2012-11-27T16:55:31.577 回答
0

不要忘记Object.create()它还没有标准化,并且在 IE8 或 FF3.6 中不起作用。克隆对象的一个​​简单解决方法是使用 JSON 对象:

function clone(obj) {
  return JSON.parse(JSON.stringify(obj));
}
于 2012-11-27T17:11:28.453 回答