2010-10-18 75 views
2

當我們在屬性(超類型中的一個數組)中引用值時,使用Crockford的方法(http://javascript.crockford.com/prototypal.html)不起作用,因爲這在所有對象中都是常見的。在JavaScript中使用Prototypal Inheritance的正確方法?

那麼,在Javascript中進行對象繼承的建議方法確實沒有問題,並且可視化地封裝了所有對象的方法和屬性?

實施例:

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function F() {} 
     F.prototype = o; 
     return new F(); 
    }; 
} 
var p1 = {name: "nick", friends : ["a1", "a2"]}; 
var p2 = Object.create(p1); 
p2.name ="john"; 
p2.friends.push("andre"); 
alert(p1.friends); 
alert(p2.friends); 
alert(p1.name); 
alert(p2.name); 

的朋友陣列返回相同的值既p1和p2,當我期望它返回不同的值。

+0

不幸的是,我現在唯一能提出的解決方案是深度克隆。希望有人有一個更好的主意。 – 2010-10-18 02:02:09

回答

0

那麼,在原型鏈的「共享」較高的成員,這是原型繼承的目標...

但是,您可以將自己的財產分配給新創建的對象(就像你做在name屬性,例如:

var foo = {foo: "xxx", array : ["a1", "a2"]}; 

var bar = Object.create(foo); 
bar.foo = "yyy"; 
bar.array = ["b1", "b2"]; 
bar.array.push("bar"); 

alert(foo.array); // ["a1", "a2"] 
alert(bar.array); // ["b1, "b2", "bar"] 
alert(foo.foo);  // "xxx" 
alert(bar.foo);  // "yyy" 

標準Object.create方法,可在latest browser versions,提供了一種方法來創建自己的屬性,使用第二個參數,例如,你可以:

// ... 
var bar = Object.create(foo, { 
    foo: { value: 'yyy'}, 
    array: {value: ["b1", "b2"] } 
}); 
// ... 
-1

你能提供一個什麼不起作用的例子嗎?原型繼承實際上是指對象文字。如果您試圖修改以數組形式創建的東西,我知道使用繼承的唯一方法是修改Array.prototype。

相關問題