创建对象的新实例

时间:2014-08-06 12:40:34

标签: javascript object instance

我开始编写代码假设:

person1 = person 

会给我一个新实例,但事实并非如此。 person1实际上是person的引用/指针。

person = {age : 2}

person1 = person;

person.age = 3;

alert(person1.age); //gives us 3.

如何在不改变代码的情况下创建新实例?我在对象,函数(方法?)和所有内容中都有300行代码。不想重写为构造函数。

4 个答案:

答案 0 :(得分:2)

如果需要新实例,则需要克隆对象。

一种(浅层)克隆方式是使用JSON.stringifyJSON.parse。请注意,这不会正确复制方法:

var person1 = JSON.parse(JSON.stringify(person))

更准确地说,如果要复制方法(等等),可以遍历person对象并将键值应用于新的对象实例({}) )。在this answer

中演示了一种“优雅”的方式
function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

话虽如此,有许多不同的克隆方法。查看此SO post进行比较。

答案 1 :(得分:0)

如果你使用下划线,试试这个:

person1 = _.clone(person);

答案 2 :(得分:0)

浅层副本,如下划线或JSON解析+ strinfigy不会复制函数(如果有的话)。

根据当前人物对象的结构,可能就足够了

person1= new person();

JS没有真正的“类”对象类型。在大多数情况下,函数可以被视为类。

请记住,任何人的属性反过来都是对全局对象的引用,在所有人的实例中都是常见的。这不是一件坏事。我已经看到用作数据存储区的类属性可以使实例相互通信。

编辑:我记得很久以前我读过一篇关于"elegant way to deep clone objects"的帖子。那时候它给了我很多帮助。它的意思是克隆变量深度的对象和属性,但同样,它不会复制方法。

答案 3 :(得分:0)