如何在javascript中访问父对象的方法?

时间:2019-01-17 18:33:40

标签: javascript class ecmascript-6

说我有一些像下面这样的类层次结构。引擎类是否可以访问父级的someMethod()方法?

class vehicle{
  constructor(){
    this.eng = new engine();
    ...
  }

  someMethod(a){
    ...
  }
  ...
}



class engine{
  ...
}

2 个答案:

答案 0 :(得分:1)

有很多方法可以解决您想要的事情,而您必须问自己:从概念上讲,这应该如何工作?

您必须重新考虑整个情况。最重要的是,为什么引擎要关心它所在的车辆?车辆只在乎引擎在做什么,而不在乎其他方面。

因此,假设您在车辆上有一种start方法。看起来像

start() {
  this.engine.start().then(function(infofromengine) {
    console.log('engine started', infofromengine);
  }, function(errorfromengine) {
    console.log('error in engine start', errorfromengine);
  }
}

在您的引擎中,您将拥有start方法,该方法返回Promise以及车辆可能需要了解的有关引擎的任何信息;

您还可以在初始化车辆中的引擎时,设置各种事件发射器,并在您的车辆构造函数中挂钩这些发射器。

更进一步,您可能需要一些子组件,以便彼此了解。因此,您可以在构造中“连接它们”。一个与此矛盾的例子可能在您的车辆构造器中

constructor() {
  this.checkEngineLight = new Light();
  this.engine = new Engine({checkEngineLight});
}

在引擎中

constructor(config) {
  let {checkEngineLight} = config;
  this.engineLight = checkEngineLight;
}

someEngineAction() {
  if (some_error_happens) this.engineLight.toggle(true, someerrorid);
}

我们之所以被称为“软件工程师”或“软件架构师”,是有原因的。我们不仅要编写代码,还必须考虑代码如何与所有活动部件交互。

但是要更直接地回答您的问题,在“引擎”绝对必须直接访问“车辆”的情况下,您必须向引擎“ 告诉”……就像您对检查引擎指示灯的描述:new Engine(this),而引擎构造函数将为constructor(vehicle)

答案 1 :(得分:0)

对此问题有两种解决方法

首先,如果您像这样继承父级的属性:

class engine extends vehicle {
  someMethod(a) { // method name has to be the same name as parent, calling super calls vehicle's someMethod(a) method
    super(a); // vehicle.super called
  }
}

或创建车辆实例并调用方法

class engine {
  someMethod(a) { // can be any name, as long as its using v.someMethod(a)
    const v = new vehicle();
    v.someMethod(a);
  }
}