【问题标题】:How to set properties(attributes) of a Child class object which belong to Base Class [Inheritance]? (Pass Base's attr to Child)如何设置属于基类[继承]的子类对象的属性(属性)? (将 Base 的属性传递给 Child)
【发布时间】:2019-08-28 10:30:26
【问题描述】:

我是类和 OOP 的新手,正在学习一个解释类和继承的教程,偶然发现了一些东西。

如何将属于基类的构造函数的值传递给子类?

例如,如果一个 BASE 类有

this.name=name
this .age=age

子类继承基类

在基类中,有两个属性

this.childSchoool=school
this.childfiends=friends

我可以使用super().func;访问基类的功能

如果我创建一个像

这样的子类对象
let childobj = new child("school_name", 6);

它会使用学校名称和年龄来初始化子对象

如何设置子类对象的nameage

【问题讨论】:

  • 您说“在基类中,有两个属性”。你是说子班吗?
  • 两者都有 2. base 有 name,age 。孩子上学了,朋友们

标签: javascript class oop inheritance ecmascript-6


【解决方案1】:

很简单,如果你有一个类 (classB) 继承自另一个 (classA),那么在 classB 构造函数中,你将接受 classA 构造函数的参数并传递它们。

MDN 解释了这一点。

class Base {
  constructor(name, age){
    this.name = name;
    this.age = age;
  }
}

class Child extends Base {
  constructor(name, age, school, friends){
    super(name, age); //pass along to the Base constructor
    this.school = school;
    this.friends = friends;
  }
}

let achild = new Child('ben', 4, 'School1', 99);

参数顺序很重要。但是,您也可以使用命名参数:

let bchild = new Child(school='school2', age=9, name='chris', friends=22);

或者您可以使用spread syntax 传入地图或对象:

let amap = new Map([['name', 'sally'],['school', 'school1'],['age', 10],['friends', 9001]]);

let cchild = new Child(...amap);

【讨论】:

  • 但我将如何初始化它?我的意思是我们必须做 var c= new Child (name,age,school,friends)?
  • 参数的顺序是什么?有关系吗?
  • 是的,参数顺序很重要。您还可以使用参数名称,以允许您按任意顺序放置它们
  • 非常感谢! Ps.- 还有一些其他答案也建议使用函数来设置名称。这很复杂。是否有一些特定情况我不能使用您讨论的方法?
  • Amardeep's answer 增加了getterssetters,这允许您有更复杂的更新属性的方式,例如您可以添加验证,例如 18 岁以上的人都不能成为孩子,因此有一个年龄设置器可以让您检查年龄是否不超过 18 岁。
【解决方案2】:

您必须提供这样做的方法:

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  setName = (name) => this.name = name;
}

class Cat extends Animal {
  constructor(name) {
    super(name);
  }
}

const myCat = new Cat('Tom');

console.log(myCat.name); // Logs 'Tom'

myCat.setName('Silvester');

console.log(myCat.name); // Logs 'Silvester'

【讨论】:

  • 如果我必须在我的孩子班级中使用“姓名”,为什么要打扰这一切。我的意思是我可以将另一个参数传递给基类。就是这样?没有?
  • 直接访问属性很容易出错:如果属性不存在,它只是简单地创建为新属性,尽管它不存在于原始类中。
【解决方案3】:

如何将属于基类的构造函数的值传递给 子类?

您通过super() 来完成它,它调用Baseconstructor 来初始化从Base 类继承的属性。

class Base{
  constructor(name, age){
   this._name = name;
   this._age = age;
  }
}
class Child extends Base{
  constructor(name, age, schoolname){
    super(name, age); //initializes the _name & _age properties
    this.schoolname = schoolname;
  }
  
  get name(){
    return this._name;
  }
  
  set name(name){
    this._name = name;
  }
  
  get age(){
  return this._age;
  }
  
  set age(age){
    this._age = age;
  }
  //getter setter for schoolname
}
const child = new Child("foo", 42, "bar");
console.log(child.name);
console.log(child.age);
child.name = "baz"
console.log(child.name);

在上面的代码中,Child 类中的super(name, age) 调用调用了Base 类的constructor(name, age)

现在在构造函数中设置了this._name & this._age,但这里的this实际上是Child类的对象。

当您调用new Child("foo", 42, "bar") 时,会创建一个新对象,然后将this 分配给新对象。在super(name, age) 调用中,参数nameage 用于初始化this 对象,以便child 实例将具有来自Base 类的_name_age 属性初始化为这些值。

【讨论】:

  • 这个方法和下面的答案有什么区别?我不知道哪个更好,但那些看起来很简单。使用这些有什么缺点吗?
  • @Deshwal 是相同的概念,其中调用super() 来初始化来自Base 类的道具。我刚刚在Child 类中添加了一些getter 和setter,你可以忽略它们。
  • 哦!对不起,我缺乏知识。这有点令人生畏。感谢您在这里帮助我。我会牢记这些,以便尽可能快地学习和使用它们。
猜你喜欢
  • 2019-03-09
  • 1970-01-01
  • 2011-10-16
  • 2021-11-30
  • 2021-05-07
  • 2020-12-08
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
相关资源
最近更新 更多