【问题标题】:TypeScript - getOwnPropertyNames() - Constructor Properties vs. Getter/SetterTypeScript - getOwnPropertyNames() - 构造函数属性与 Getter/Setter
【发布时间】:2017-12-06 10:52:06
【问题描述】:

我对 TypeScript 很陌生,有一点我不太明白。

想象以下类:

export class PropertyInConstructor {

  constructor(public foo: boolean) {

  }
}

export class PropertyWithGetSet {

  private _foo: boolean = false;

  get foo(): boolean {
    return this._foo;
  }

  set foo(theFoo: boolean) {
    this._foo = theFoo;
  }
}

据我了解,这两种方法都为我提供了可以使用new PropertyInConstructor().foonew PropertyWithGetSet().foo 访问的属性。

我现在想获取此类类的现有属性(无实例!)并尝试一下:

console.log(Object.getOwnPropertyNames(PropertyInConstructor.prototype));
console.log(Object.getOwnPropertyNames(PropertyWithGetSet.prototype));

[“构造函数”]
["构造函数", "foo"]

为什么构造函数内部指定属性的调用没有添加“foo”属性?

是否缺少某些东西或以其他方式获取这些属性?

【问题讨论】:

  • 据我所知,第一个示例不会创建 getter/setter 对。第二个示例实际上确实在原型上定义属性如果将示例复制到typescriptlang.org/play/index.html,您将看到这一点

标签: typescript reflection


【解决方案1】:

简短回答:大多数属性都是在运行时动态添加到实例中的。需要使用 Object.defineProperty 将带有 getter 和 setter 的属性添加到原型中。

在运行时添加

你的第一个例子:

export class PropertyInConstructor {
  constructor(public foo: boolean) {
  }
}

该属性仅在构造函数运行时添加到实例中。这是转译的 JavaScript:

var PropertyInConstructor = /** @class */ (function () {
    function PropertyInConstructor(foo) {
        this.foo = foo;
    }
    return PropertyInConstructor;
}());

实际上,在构造函数运行之前,属性foo 不存在于类中。

这不仅适用于构造函数属性,还适用于未针对原型定义的所有属性,例如:

class PropertyInConstructor {
    public foo: boolean;
    constructor() {
        this.foo = true;
  }
}

定义属性

当你使用 get 和 set 时,情况就不同了,因为属性是添加到原型中的:

var PropertyWithGetSet = /** @class */ (function () {
    function PropertyWithGetSet() {
        this._foo = false;
    }
    Object.defineProperty(PropertyWithGetSet.prototype, "foo", {
        get: function () {
            return this._foo;
        },
        set: function (theFoo) {
            this._foo = theFoo;
        },
        enumerable: true,
        configurable: true
    });
    return PropertyWithGetSet;
}());

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 2011-07-10
    • 1970-01-01
    • 2014-07-04
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多