是否可以访问刚刚指定的属性?

时间:2014-10-17 09:30:15

标签: javascript properties

我正在尝试提高我正在编写的一些代码的可读性。我将一个值数组传递给一个函数,并希望能够提取每个值。我想检查数组是否是预期的大小。

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的大小吗?

1 个答案:

答案 0 :(得分: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成为getter - 函数。这样就可以防止覆盖:

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

每次引用时都会执行getter:

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

更新:这些方法无法保护Data.Index以防止更改。如果您需要,请查看Object.seal()Object.freeze()