克隆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示例。