【问题标题】:How could I access to base class object to list its properties?如何访问基类对象以列出其属性?
【发布时间】:2019-01-06 13:29:44
【问题描述】:

我有由 Person 类继承的 BaseEntity 类。如何在 Person 类中列出基类属性 (BaseEntity)。

class BaseEntity {
    _id: string;
    created: number;

constructor(id: string, created: number = Date.now()) {
    this._id = id;
    this.created = created;
    }
}

class Person extends BaseEntity {
    name: string;
    age: number;

constructor(id: string, name: string, age: number) {
    super(id);
    this.name = name;
    this.age = age;        
    }

    listBaseClassProperties() {
      //console.log(super); HOW CAN I DO THIS?
    }
}

当我在派生类 (Person) 方法之一中尝试 console.log(super) 时,我得到 undefined...

【问题讨论】:

  • 这听起来像an X/Y problem。为什么要只列出基类的属性?
  • “当我在派生类 (Person) 方法之一中尝试 console.log(super) 时,我得到了 undefined...” 这表明您认为有多个对象在实例化派生类时创建。 (你不会是第一个这么想的人!:-))没有。创建了一个单个对象,它同时具有派生类和基类的特性。
  • 我可以通过 JavaScript 的任何运算符获取 EntityBase 类的属性吗,例如 Object.getPrototypeOf(EntityBase)
  • 实例属性通常不存在于原型上(这不是你获得BaseEntity实例原型的方式)。

标签: typescript


【解决方案1】:

这听起来像an X/Y problem,但解决了实际提出的问题:

您使用的对象不会区分它从基类代码获得的属性和它从派生类代码获得的属性。它们只是对象的属性。如果您想获取基类在初始化期间添加的属性列表,您可以在调用super(); 后立即执行此操作,以获取对象上所有自己的、可枚举属性的名称那一点:

this.baseProperties = Object.keys(this);

...假设您不使用 TypeScript 的自动属性初始化(问题的代码中没有使用)。

然后在listBaseClassProperties:

console.log(this.baseProperties.map(name => ({name, value: this[name]}));

...或者您可以使用从Object.keys 获得的姓名列表的任何其他方式。

当然,基类中的代码可以随时添加属性,但 TypeScript 的静态类型系统强烈反对这样做,因此在初始化后立即获取那些可能是 Good Enough™。 ;-)

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 2020-11-20
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多