javascript - 在javascript中使用原型(prototype)继承

标签 javascript oop prototypal-inheritance

我有以下代码。为什么三个对象都引用同一个数组,而字符串变量是独立的?如何在不显式添加的情况下修复它: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

最佳答案

一个解释是:

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

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

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

为了使用 JS 的原型(prototype)系统,我建议这样:

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 原型(prototype)的内容,我推荐这个 article

希望这对您有所帮助。

关于javascript - 在javascript中使用原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46042992/

相关文章:

javascript - 从 child 身上移走 child

javascript - 正则表达式:向字边界添加加号

javascript - 使用 jQuery 和下拉菜单更新网站

java - Java中 protected 类结构?

javascript - Angularjs 服务、工厂和原型(prototype)继承

javascript - 将值附加到表上的属性 "header"

java - 软件开发中模型和图表之间的概念区别是什么

ruby - ruby 中的类/静态方法有什么用?

javascript - Object.create 中的对象属性值是常量吗?

javascript - Node.js 中的函数构造函数是什么?