2017-04-21 85 views
0

我有一個數據對象,我已經在打字稿等被定義的屬性:爲什麼TypeScript在原型而不是對象上定義屬性?

get name() { 
    return this._hiddenName; 
} 
set name(value) { 
    ...stuff... 
    this._hiddenName = value; 
} 

,但是當我去的輸出碼我看到

Object.defineProperty(MyObject.prototype, "name", { 

所以財產上的原型,而不是存在目的。當我想調用它時,這很好,但是當我想用Object.keys()來查看對象的屬性時,這些屬性將不會被拾取。

具體而言,我將具有屬性的對象傳遞給Angular中的FormGroup,並嘗試將對象映射到使用Object.keys的對象,該對象找到我的支持屬性,但不是我實際想要公開的屬性。

+2

沒錯,'name'不是自己的屬性,所以它沒有被'Object.keys'列出。它在原型上定義是絕對正確的,因爲你通過使用類成員的名稱告訴它它在那裏。 – dfsq

+0

好吧,所以我的假設是屬性是爲了封裝而設計的,所以你可以讓某件事情像對象上的基本價值一樣。事實上,JavaScript有一個「enumerable」,它使屬性顯示爲對象的正常部分(在Object.keys()中)。 TypeScript實際上設置了「enumerable:true」,但隨後將屬性從對象中取出並放入原型中,該原型專門禁用了「enumerable:true」的意圖以及屬性對外部世界的正常價值。 – WillSeitz

+0

用'for ... in'迭代時,包含原型*上的可枚舉屬性*。 – Pointy

回答

2

如果你定義一個類,所有的方法和getter/setter方法將是在原型:

class MyObject { 
    private _hiddenName: string 
    get name() { 
    return this._hiddenName; 
    } 
    set name(value) { 
     this._hiddenName = value; 
    } 
} 

但是你可以定義一個對象:

let obj = { 
    _hiddenName: "abc", 
    get name() { 
    return this._hiddenName; 
    }, 
    set name(value) { 
     this._hiddenName = value; 
    } 
} 

這裏,吸氣和二傳手在對象中。編譯後的代碼與TypeScript代碼相同。

相關問題