克隆Javascript对象及其类型

克隆Javascript对象及其类型,javascript,types,clone,Javascript,Types,Clone,关于克隆JS对象有很多问题,但这个问题似乎并不存在 我有一个函数a扩展一个函数B,如下所示: function A () {} function B () {} B.prototype = new A() 然后我有一个类型为b的对象b。我想克隆它,并保留它的类型,这样b的克隆将是b类型 下面是我克隆它的方式:() 函数A(){} 函数B(){} B.原型=新的A() var b=新的b() var bPrime=新的b.构造函数() $(“#a”).text(b实例a) $(“#b”).te

关于克隆
JS
对象有很多问题,但这个问题似乎并不存在

我有一个函数
a
扩展一个函数
B
,如下所示:

function A () {}
function B () {}
B.prototype = new A()
然后我有一个类型为
b
的对象
b
。我想克隆它,并保留它的类型,这样
b
的克隆将是
b
类型

下面是我克隆它的方式:()

函数A(){}
函数B(){}
B.原型=新的A()
var b=新的b()
var bPrime=新的b.构造函数()
$(“#a”).text(b实例a)
$(“#b”).text(b实例b)
$(“#aPrime”).text(b优先级实例A)
$(“#bPrime”).text(B的bPrime实例)

b为A类:

b属于b类:
bPrime属于A类:

bPrime是类型B:
您需要将
B.prototype.constructor
设置回
B
。实际上,它继承自
A
,构造函数是
A
。因此,当您执行
新建b.constructor()
时,您实际上得到了一个
新建a()

函数A(){}
函数B(){}
B.原型=新的A()
B.prototype.constructor=B
var b=新的b()
var bPrime=新的b.构造函数()
$(“#a”).text(b实例a)
$(“#b”).text(b实例b)
$(“#aPrime”).text(b优先级实例A)
$(“#bPrime”).text(B的bPrime实例)

b为A类:

b属于b类:
bPrime属于A类:
bPrime是类型B:

方法创建具有指定原型对象和属性的新对象

function A() {}

function B() {}
B.prototype = new A()

var b = new B();

var c = Object.create(b);
console.log(c instanceof B);    // -> true

克隆是一个相当含糊的词。如果您想要创建一个完全新的对象,而不引用任何与源对象相关的内容,那么在事先不了解有关对象的情况下,这是很难做到的,尽管如果您愿意,您可以做一些不可靠的基于原型的事情(不特别可取)。在ES6中,由于对象/构造函数/原型可能拥有私有符号、弱映射等,因此在这种“逐个属性”的意义上,确实不可能可靠地深度克隆事物

但是,您可以使用Object.create(b)来创建一个以b为自己原型的新对象。如果你更换

var bPrime=new b.constructor()

var bPrime=Object.create(b)

然后得到四个
true
s。然而,由于b在这里充当bPrime的原型,对b的更改将反映在bPrime中,除非bPrime提供自己的定义来覆盖这些内容。出于克隆目的,可能不需要这样做,因为:

b.prop; // undefined
bPrime.prop; // undefined
b.prop = 7;
bPrime.prop; // 7!
但我们可以做一些改进:

var bPrime = Object.create(Object.getPrototypeOf(b));

现在您得到了四个true,但对b的进一步修改不会反映在bPrime上。

我喜欢这些A/b示例。