2017-12-06 7 views
0

저는 TypeScript를 처음 접했고 꽤 이해가되지 않는 요점이 있습니다. 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; 
    } 
} 

이 두 가지 방법 모두 내게 new PropertyInConstructor().foo 또는 new PropertyWithGetSet().foo를 사용하여 액세스 할 수있는 속성을 제공합니다.

는 지금 (! 예를없이 를) 같은 클래스의 기존 속성을 싶어하고 그것을 밖으로 시도 :

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

[ "생성자"]
[ "생성자"

, "foo"]

왜 생성자에서 속성을 지정하는 호출에 "foo"속성이 추가되지 않습니까?

누락되었거나 다른 속성으로 이러한 속성을 얻을 수 있습니까?

+0

제가 아는 한, 첫 번째 예제에서는 getter/setter 쌍을 만들지 않습니다. 두 번째 예제는 실제로 프로토 타입에 defineProperty를 수행합니다. 예제를 http://www.typescriptlang.org/play/index.html로 복사하면이 내용이 표시됩니다. –

답변

2

짧은 대답 : 대부분의 속성은 런타임에 동적으로 인스턴스에 추가됩니다. getter 및 setter가있는 속성은 Object.defineProperty으로 프로토 타입에 추가해야합니다.

는 첫 번째 예와

런타임

에 추가 : 생성자가 실행될 때

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

속성은 인스턴스에 추가됩니다. 여기에 transpiled 자바 스크립트는 다음과 같습니다

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