0

object.a配列であるようなオブジェクトを作成したいのですobject.bが、その長さは次のとおりです。

var object = {
   a:[1,2,3,2],
   b: this.a.length
}
alert(b);

しかし、これは4に警告しません。何か問題がありますb: this.a.length

Uncaught TypeError: Cannot read property 'length' of undefined

なぜこれが起こっているのか誰かが私に説明してくれたら嬉しいです。

このように書くと、実際に4に警告します。

 var object = {
       a:[1,2,3,2]
 }
    alert(object.a.length);

[更新]この方法でオブジェクトを作成しても、機能しません。

var object = {
   a:[1,2,3,2],
   b:object.a.length
}
4

4 に答える 4

3

主な問題は、最初の例のようなjavascriptデータ宣言では、の値thisが定義されているオブジェクトに設定されていないことです。したがって、thisはオブジェクトではないため、オブジェクト宣言内ではオブジェクトのプロパティをthis.a参照しません。a

これは、データ宣言の直前のコンテキストにあったものです。それがグローバルコンテキストである場合、それthiswindowオブジェクトであり、this.aおそらく存在しません。それが存在しない場合(たとえば、存在する場合undefined)、参照しようとすると、オブジェクトではないものthis.a.lengthからプロパティを読み取ろうとします。これは、javascriptエラーです。.length


この問題を解決することに関しては、配列の長さを別のプロパティにコピーすることは一般的に悪い考えです。それはあなたにそれが間違っていて、配列の実際の長さと同期していない可能性を与えるだけです。配列の長さが必要な場合は、必要に応じて次のコマンドで配列を取得する必要があります。

object.a.length

本当にプロパティ(固定値を持ち、変更しても変更されないa)にしたい場合は、オブジェクトの作成後に設定できます。

var object = {
   a:[1,2,3,2],
};
object.b = object.a.length;
alert(object.b);
于 2012-08-31T16:54:56.817 に答える
1

オブジェクトのすべてのプロパティは一度にインスタンス化されるためthis、プロパティを作成するときにウィンドウオブジェクトを参照しますb。の値の解釈を延期する必要がありbます。1つの方法は、代わりに関数を使用することです。

var object = {
    a:[1,2,3,2],
    b: function () {
        return this.a.length;
    }
}

b別の方法は、オブジェクトリテラルが宣言された後にプロパティを追加することです。

var object = {
    a:[1,2,3,2]
}
object.b = object.a.length;

最後に、新しいブラウザでは、ゲッターを利用できます。

var object = {
    a:[1,2,3,2],
    get b() {
        return this.a.length;            
    }
}
于 2012-08-31T16:57:27.310 に答える
0

最初の例では、オブジェクト「object」内のプロパティ「b」ではなく「b」という名前の変数を検索しているため、「b」は未定義です。代わりにobject.bを使用する必要があります。

于 2012-08-31T16:56:03.657 に答える
0

bオブジェクトを作成した後、オブジェクトに追加します。

var object = {
    a:[1,2,3,2]
}

object.b = object.a.length
于 2012-08-31T16:58:09.217 に答える