2011-11-10 99 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

相關問題