簡體   English   中英

如何在javascript中訪問父對象的方法?

[英]How can I access a parent object's method in javascript?

說我有一些像下面這樣的類層次結構。 引擎類是否可以訪問父級的someMethod()方法?

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

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



class engine{
  ...
}

有多種方法可以實現所需的功能,而您必須問自己:從概念上講,這應該如何工作?

您必須重新考慮整個情況。 最重要的是,為什么引擎要關心它所在的車輛? 車輛只在乎引擎在做什么,而不在乎其他方面。

因此,假設您在車輛上有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)

有兩種解決方案

首先,如果您像這樣繼承父級的屬性:

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);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM