2014-10-17 77 views
1

我正在使用嘗試提高我寫的一些代碼的可讀性。我將一組數值傳遞給一個函數,並希望能夠提取每個值。我想檢查一下數組是否是預期的大小。是否可以訪問剛指定的屬性?

function useData(data) { 
    if (data.length != Data.Size) { 
     // ERROR 
    } 

    var name = data[Data.Indexes.NAME]; 
    var age = data[Data.Indexes.AGE]; 
    var weight = data[Data.Indexes.WEIGHT]; 
} 

我想知道有多少性能是Data.Indexes,我已經嘗試以下兩種方法,

var Data = { 
    Indexes : { 
     NAME : 0, 
     AGE : 1, 
     WEIGHT : 2 
    }, 
    Size : Objects.keys(Indexes).length // Doesn't work. 
}; 
Data.Size2 = Object.keys(Data.Indexes).length; // Works. 

我能找到的Indexes大小,同時還在裏面Data

+0

你有沒有嘗試'大小:Objects.keys(this.Indexes).length'裏面的數據? – artm 2014-10-17 09:35:13

+2

似乎有什麼你不告訴我們。如果定義'Data'的代碼看起來像這樣,那麼你知道'Indexes'的大小是3,並且你可以簡單地寫'Size:3'。如果'Indexes'實際上是通過其他方法定義的,比如說從一個變量來說,那麼你可以檢查這個變量'var Data = {Indexes:myIndexes,Size:Object.keys(myIndexes).length'。 (但要回答你的問題,不,我不相信你可以在定義它的語句中訪問一個對象的屬性) – 2014-10-17 09:38:09

+0

@David Hedlund我試圖避免錯誤被引入,如果'Data.Indexes'被更改爲添加或刪除一個屬性。我曾經用過的每種語言都被這樣的東西燒燬了! – 2014-10-17 10:36:25

回答

1

您可以Size - 屬性的函數索引像這樣返回的屬性數:

var Data = { 
    Indexes : { 
     NAME : 0, 
     AGE : 1, 
     WEIGHT : 2 
    }, 
    Size : function() {return Object.keys(this.Indexes).length} 
}; 

現在你可以電話它內部功能useData()

function useData(data) { 
    if (data.length != Data.Size()) {/* ERROR */} 
    /* ... */ 
} 

的第二種方式使Data.Size a getter功能。這樣,它的防覆蓋保護:

var Data = { 
    Indexes : { /* ... */ }, 
    get Size() {return Object.keys(this.Indexes).length 
}; 

吸氣劑每次參考它時執行:

function useData(data) { 
    if (data.length != Data.Size) {/* ERROR */} 
    /* ... */ 
} 
Data.Size = 55; // nothing happens 

更新:這些方法並不能保護Data.Indexes反對改變。如果你需要的話,看看Object.seal()Object.freeze()

相關問題