Javascript 克隆或应用:哪一个是;更好;?

Javascript 克隆或应用:哪一个是;更好;?,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,我想创建一系列对象,这些对象从基础对象继承或复制实例属性。这让我决定使用哪种模式,我想问问你们对哪种方法“更好”的看法 它们都实现了相同的功能,即基于公共模板的独特实例属性-问题是哪一个更“优雅”从您的问题听起来,您似乎在寻找类似的东西。此函数可用于创建一个新对象,该对象具有您选择的对象作为原型 //for old browsers without Object.create: var objCreate = function(proto){ function F(){}; F.

我想创建一系列对象,这些对象从基础对象继承或复制实例属性。这让我决定使用哪种模式,我想问问你们对哪种方法“更好”的看法


它们都实现了相同的功能,即基于公共模板的独特实例属性-问题是哪一个更“优雅”

从您的问题听起来,您似乎在寻找类似的东西。此函数可用于创建一个新对象,该对象具有您选择的对象作为原型

//for old browsers without Object.create:
var objCreate = function(proto){
    function F(){};
    F.prototype = proto;
    return new F();
至于与克隆方法的比较,它们做了不同的事情,因此您必须选择更合适的方法

使用原型将在子对象上反映父对象上的更改

a = {x:1};
b = Object.create(a);
a.x = 2;
//b.x is now 2 as well
您还必须小心使用包含此的方法。根据您所做的,如果您使用太多的原型继承,您可能会产生不想要的后果

a ={
   x: 1,
   foo: function(){ this.x += 1 }
}
b = Object.create(a);
b.foo();
//a.x does not change

另一方面,克隆克隆内容,以便您可以确保对象不会以任何方式相互干扰。有时候这就是你想要的。

好的,所以我对这一点做了进一步的思考——答案来自用例。当clone将属性复制到给定范围时,apply将更改属性周围的范围。前者适用于混合,后者适用于继承。

在将
inst
赋值为下一行的函数之前,设置
inst.prototype=…
是否真的有效?这应该是
instConstructor.prototype=…
好的地方-抱歉-这是一个错误,我们也一直在研究该方法,但遇到了一些问题:除非您可以使用新的getPrototypeOf或ptoto之类的东西,否则获取对象原型的句柄是很挑剔的。根据您要执行的操作,从要克隆的对象复制方法也可能有效。
a ={
   x: 1,
   foo: function(){ this.x += 1 }
}
b = Object.create(a);
b.foo();
//a.x does not change