3

Arrayループで繰り返されないがFor IN、作成されたインスタンスごとに異なる値を持つ長さのようなプロパティをjavascriptに追加することは可能ですか?

次のコード:

a = new Array();
a.dimension = 2; //add a new property to array

ここで、for inloop を使用して iterate を使用するとa、ディメンションも繰り返されますが、これは望ましくありません。

このようなプロパティを追加することは可能ですか?

4

1 に答える 1

6

はい、可能です。definePropertyを使用-

Object.defineProperty(a, "dimension", {
    enumerable: false,
    configurable: true,
    writable: true,
    value: 2
});

これにより、 for..in ループで列挙されないdimensionforと呼ばれるプロパティが作成されます。a

このようなプロパティを作成するための関数を定義できます-

function defineArrayProperties(object, property, value) {
    Object.defineProperty(object, property, {
        enumerable: false,
        configurable: true,
        writable: true,
        value: value
    });
}

そして、次のように呼び出すことができます-

var b = [];
defineArrayProperties(b, "dimension", 3);

プロトタイプでこの関数を作成し、Arrayすべての配列オブジェクトにデフォルトで継承させることもできます -

Array.prototype.defineProperty = function (property, value) {
    Object.defineProperty(this, property, {
        enumerable: false,
        configurable: true,
        writable: true,
        value: value
    });
};

var b = [];
b.defineProperty("dimension", 4);
alert(b.dimension);   // will alert 4

ライブ フィドルは、上記の両方のアプローチを示しています。2 つの配列オブジェクトを作成し、for...in を使用してそれらのすべてのプロパティを列挙しました。dimensionfor...in のいずれにも表示されないことに注意してください。

編集

Object.definePropertyが正しく動作するには、ブラウザが ECMAScript 5 をサポートしている必要があります。

于 2013-08-29T06:32:59.533 に答える