javascript原型继承bug

时间:2014-05-09 18:32:20

标签: 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

1 个答案:

答案 0 :(得分: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');
 }

否则,您只需使用ax作为上下文(a.prototype的值)调用this