我开始编写代码假设:
person1 = person
会给我一个新实例,但事实并非如此。 person1
实际上是person
的引用/指针。
person = {age : 2}
person1 = person;
person.age = 3;
alert(person1.age); //gives us 3.
如何在不改变代码的情况下创建新实例?我在对象,函数(方法?)和所有内容中都有300行代码。不想重写为构造函数。
答案 0 :(得分:2)
如果需要新实例,则需要克隆对象。
一种(浅层)克隆方式是使用JSON.stringify
和JSON.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)
请参阅Object.assign(ES6功能)http://www.2ality.com/2014/01/object-assign.html