【问题标题】:inheritance using prototype in javascript [duplicate]在javascript中使用原型继承[重复]
【发布时间】:2017-09-04 19:21:31
【问题描述】:

我有以下代码。为什么三个对象都引用同一个数组,而字符串变量是独立的?如何在不显式添加的情况下修复它:function B(){this.arr = [];}

function A(){
  this.text = "";
  this.arr = [];

  this.action = function(){
    this.text+="z";
    this.arr.push(1); 
  }

  this.test = function(){
    console.log(this.text+"|"+this.arr);
  }
}

function B(){
    
}

B.prototype = new A();        
B.prototype.constructor = B;
var B1 = new B();
var B2 = new B();
var B3 = new B();

B1.action();
B2.action();
B3.action();
B1.test(); //z|1,1,1
B2.test(); //z|1,1,1
B3.test(); //z|1,1,1

【问题讨论】:

  • 你应该使用function B() { A.call(this) } 而不是重复父构造函数所做的一切。

标签: javascript oop prototypal-inheritance


【解决方案1】:

一个解释是:

原型是对象之间的实时链。因为 B 的原型是 A 的单音实例,所以数组 prop 是通过引用传递的。这意味着对于每个 B 实例,我们都可以访问原型上的相同 A 实例。起初这听起来可能令人困惑,但这就是 JavaScript 中原型的魔力。

这是原型继承的警告。原型上的任何东西都将传递给每个实例。为了维护属性的不同实例,我们在构造函数中初始化对象的属性。

在 JS 中处理对象(如数组)时,它们是通过引用传递的。

为了使用 JS 的原型系统,我建议如下:

function A(){
  this.text = "";

  this.action = function(){
    this.text+="z";
    this.arr.push(1); 
  }

  this.test = function(){
    console.log(this.text+"|"+this.arr);
  }
}

function B(){
    this.arr = [];
}

B.prototype = new A();

这样,我们重用了“父”中的方法,并在“子”中有一个本地化数组。乍一看,这可能看起来像是一个经典的 OOP 继承案例,但它有点不同。

如果你想了解更多关于 JS 原型的信息,我推荐article

希望这会有所帮助。

【讨论】:

  • 感谢您的解释。问题是,我也有从 A 继承的 C、D、E,我不想复制我的代码。我想我必须改用寄生继承。 stackoverflow.com/a/2107586/5902472
  • 不,不要使用此代码。 It's still wrong
  • @Bergi 感谢您的参考,我只是在解释为什么它以前不起作用。我同意这不是实现原型继承的最佳方式。
猜你喜欢
  • 2019-01-24
  • 2016-07-04
  • 2020-12-28
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多