Javascript 创建对象的新实例

Javascript 创建对象的新实例,javascript,object,instance,Javascript,Object,Instance,我开始编写代码,假设: person1 = person 会给我一个新的例子,它不会person1实际上是指向person的引用/指针 person = {age : 2} person1 = person; person.age = 3; alert(person1.age); //gives us 3. 如何在不改变大量代码的情况下创建新实例?我在对象、函数(方法?)和所有内容中有300行代码。不想作为构造函数重写。如果需要新实例,则需要克隆对象。 一种(浅显的)克隆方法是使用J

我开始编写代码,假设:

person1 = person 
会给我一个新的例子,它不会
person1
实际上是指向
person
的引用/指针

person = {age : 2}

person1 = person;

person.age = 3;

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

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

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

一种(浅显的)克隆方法是使用
JSON.stringify
JSON.parse
。请注意,这将无法正确复制方法:

var person1 = JSON.parse(JSON.stringify(person))
更准确地说,如果要复制方法(等等),可以迭代
person
对象,并将键值应用于新的对象实例(
{}
)。实现这一点的“优雅”方法如下所示:



也就是说,有很多种不同的克隆方法。查看此项以进行比较。

如果使用下划线,请尝试以下操作:


person1=\克隆(person)

浅层副本,如下划线或JSON parse+strinfigy不会复制函数(如果有)

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

person1= new person();
JS没有真正的“类”对象类型。在大多数情况下,函数可以被视为类

请记住,作为全局对象引用的任何person属性在person的所有实例中都是通用的。这不一定是坏事。我见过类属性被用作数据存储,以使实例彼此对话

编辑:我记得很久以前读到一篇关于一家公司的帖子。那时候对我帮助很大。它的目的是克隆对象和可变深度的属性,但同样,它不会复制方法。

请参阅Object.assign(ES6功能)


@Downvoter?想解释一下为什么吗?这对函数和循环结构有效吗?stringify解析策略不会(它很肤浅)。SO post中的其他方法和迭代方法都将使用。请参阅更新的答案。:)我在对象、函数(方法?)和所有内容中有300行代码。您应该选择一个更好的选项来演示,而不是依赖链接,或者您应该将其标记为副本?对不起,我现在知道了,您的答案现在更有意义了。:)您的代码将导致[object]不是函数,而是对象。异常请参见操作代码person={age:2};没错,问题中给出的当前示例是一个浅层对象,您无法对其进行实例化。这就是为什么我说“取决于当前对象的结构”。模型也是对象。请投赞成票,提醒我不要做假设。。。。300行代码?为什么不把它做好呢?你几乎什么都没有。我们能多看看真人对象吗?克隆散列、函数、模型等的答案差别很大。谁否决了这个问题?它产生了大量的答案,每个答案都有评论。这是我们想经常看到的问题。@Dave,我知道问题不多,而且我一开始也不知道该怎么做。好吧,现在假设它是要创建一个构造函数,因为我认为这就是你的建议。如果没有捷径,我会用正确的方法。
person1= new person();