首页 > 解决方案 > Angular 服务可以引用它的发起者吗?

问题描述

考虑两个可注入服务:UsersServiceAdminUserService extends UserService.
UserService在它的构造函数中应用了一些初始化过程。
但由于AdminUserService调用super()UserService构造函数被调用两次
请接受这种模式作为事实,因为我目前无法更改它。

我的问题是:的构造函数可以UserService知道是谁调用了它并采取相应的行动吗?

标签: angular

解决方案


您可以在父构造函数中轻松访问对象的实例并检查其构造函数的名称,这将反映被实例化的类的名称。

class Parent {
  constructor() {
    console.log("I am", this.constructor.name);
  }
}

class Child1 extends Parent {
  constructor() {super();}
}

class Child2 extends Parent {
  constructor() {super();}
}

var a = new Child1();
var b = new Child2();

虽然真正的问题是——你为什么需要这样做?我认为您需要在父类中访问该信息这一事实表明您需要重新考虑您的设计。也许将一些实例化逻辑移到父级之外?也许让父抽象,给它抽象方法,将在构造函数中调用,然后让孩子相应地实现该方法?见上面的片段:

abstract class Parent {
  constructor() {
    doSomethingInConstructor();
  }
  
  abstract doSomethingInConstructor(): void;
}

class Child1 extends Parent {
  constructor() {
    super();
  }
  
  doSomethingInConstructor(): void {
    console.log("I do something as Child 1");
  }
}

class Child2 extends Parent {
  constructor() {
    super();
  }
  
  doSomethingInConstructor(): void {
    console.log("I do something else, since I'm a Child 1");
  }
}

var a = new Child1();
var b = new Child2();

推荐阅读