2014-05-09 163 views
-1

超類具有'容器'屬性。JavaScript原型繼承錯誤

當子類從超類繼承時,'container'屬性在子類之間共享。

它是如何實現的,每個子類都有其超類的副本及其所有屬性。

var a = function() { 
}; 

a.prototype.ax = function() { 
    this.container = []; 
} 

var b = function() { 
a.call(this); 
} 

b.constructor = b; 
b.prototype = Object.create(a.prototype); 

b.prototype.ax = function() { 
a.prototype.ax(); 
    this.container.push('b'); 
} 

var c = function() { 
a.call(this); 
} 

c.constructor = c; 
c.prototype = Object.create(a.prototype); 

c.prototype.ax = function() { 
    a.prototype.ax(); 
    this.container.push('c'); 
} 


var bi = new b(); 
var ci = new c(); 

bi.ax(); 
ci.ax(); 

// why bi container gets overriden? 
console.log(bi.container); 

JS Fiddle

回答

0

你的問題是在這裏:

b.prototype.ax = function() { 
    a.prototype.ax(); 
    this.container.push('b'); 
} 

要調用父類的功能,你需要它,像這樣:

b.prototype.ax = function() { 
    a.prototype.ax.call(this); 
    this.container.push('b'); 
} 

否則,你只是調用axa.prototype爲上下文(值爲this)。