2011-11-10 48 views
3

我想创建一系列从基础对象继承或复制实例属性的对象。这导致我决定使用哪种模式,并且我想问你的意见,哪种方法“更好”。克隆还是应用:哪个更好?

//APPLY: 
// --------------------------------------------------------- 
//base object template 
var base = function(){ 
    this.x = { foo: 'bar'}; 
    this.do = function(){return this.x;} 
} 

//instance constructor 
var instConstructor = function (a,b,c){ 
    base.apply(this);//coerces context on base 
    this.aa = a; 
    this.bb = b; 
    this.cc = c; 
} 

instConstructor.prototype = new base(); 

var inst = function(a,b,c){ 
    return new instConstructor(a,b,c); 
} 

//CLONE 
// --------------------------------------------------------- 
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; 
}  

var x = {foo: 'bar'}; 

function instC(a,b,c){ 
    this.aa = a; 
    this.bb = b; 
    this.cc = c; 
    this.x = clone(x); 
}; 

instC.prototype.do = function(){ 
    return this.x; 
} 

它们都实现了基于一个通用模板同样的事情,即独特的实例属性 - 问题是更“优雅”

+0

真的可以设置'inst.prototype = ...'_before_你指定'inst'等于下一行的函数吗?这应该是'instConstructor.prototype = ...' – nnnnnn

+0

好点 - 对不起 - 这是一个错字 – sunwukung

回答

0

好吧,我已经给出了一些进一步的想法 - 答案源于用例。在克隆将属性复制到给定范围的情况下,应用程序正在改变属性周围的范围。前者更适合mixin,后者更适合继承。

2

通过你的问题的声音,它看起来哪一个像你正在寻找类似于Object.create。这个函数可以用来创建一个新的对象,它有一个你选择的对象作为原型。

//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 

您还必须小心使用有this的方法。根据你做什么,如果你使用太多的原型继承,你可能会有不必要的后果。

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

在另一方面,克隆克隆的东西,所以你可以肯定的是,对象将不以任何方式互相干扰。有时候这就是你想要的。

+0

是,也一直在看这种方法,但遇到了一些问题:http://stackoverflow.com/questions/8073055/轻微的缺点与crockford原型继承/ 8076515#8076515 – sunwukung

+0

得到一个对象的原型句柄是finicky,除非你可以使用像新的getPrototypeOf或__ptoto__的东西。根据你想要做的事情,复制来自克隆对象的方法也可能起作用。 – hugomg

相关问题