2017-12-06 10 views
0

私はかなりTypeScriptを新しくしています。これら二つのアプローチは、私がnew PropertyInConstructor().fooまたはnew PropertyWithGetSet().fooを使用してアクセスできるプロパティを提供し、両方の私の理解からTypeScript - getOwnPropertyNames() - コンストラクタのプロパティ対Getter/Setter

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

は、以下のクラスを想像してみてください。

I今(インスタンスなし!)、このようなクラスの既存のプロパティを取得したいし、それを試してみる:

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

を[ "コンストラクタ"]
[ "コンストラクタ"、 "foo"]

コンストラクタ内でプロパティが指定されている呼び出しで "foo"プロパティが追加されないのはなぜですか?

これらのプロパティを取得するには、何か不足か他の方法がありますか?

+0

最初の例では、ゲッター/セッターのペアは作成されません。 2番目の例は実際にプロトタイプのdefinePropertyを実行します 例をhttp://www.typescriptlang.org/play/index.htmlにコピーするとこれが表示されます –

答えて

2

短い答え:ほとんどのプロパティは、実行時にインスタンスに動的に追加されます。 getterとsetterを持つプロパティは、Object.definePropertyというプロトタイプに追加する必要があります。

はあなたの最初の例では

ランタイム

に追加しました:コンストラクタの実行時に

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

プロパティはインスタンスに追加されます。ここtranspiled JavaScriptは次のとおりです。

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

事実上、財産fooは、コンストラクタが実行されるまでクラスに存在しません。

これは、例えば、プロトタイプに対して定義されていないすべてのプロパティのためにそれは、単にコンストラクタのプロパティのためではありません。あなたが取得および設定を使用すると

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

は、物事をプロパティ

を定義しますプロパティがプロトタイプに追加されているため、次のようになります。

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; 
}()); 
関連する問題