2016-09-06 18 views
1

私はオブジェクトを定義し、javascriptのdefinePropertyメソッドを使用してプロパティを定義しました。definePropertyメソッドを使用してオブジェクトにプロパティを設定できません

var obj ={}; 
Object.defineProperty(obj,'b',{get:function(){ 
return 5}, 
set:function(value){ 
this.b = value} 
}); 

しかし、私は声明

obj.b = 25 

の下に使用してbをそれは私に

を与えるの値を設定しています例外RangeError:最大コールスタックのサイズは、私が設定することができますどのように

を超えましたbの値は?あなたは無限再帰ループにセッターを使用している

+0

「b」から「this」を削除します。 setメソッドで 'b = value'と設定して、動作すれば教えてください。 –

+0

あなたのブラウザは? definePropertyと互換性がありますか? –

+0

私はブラウザでこれをやっていません。私はノードのreplを使用しています。 @RicardoPontual –

答えて

2

、セッター内のコードは再びそれを使用している:

this.bVal=value; 

すべてのコード:

のような任意の別の変数名に

this.b = value; //this use setter of b again 

変更を

//example object 
 
obj={}; 
 

 
Object.defineProperty(obj,'b',{ 
 
get:function(){ 
 
    return this.bVal; 
 
}, 
 
set:function(value){ 
 
    this.bVal=value; 
 
} 
 
}); 
 

 
obj.b="Test text value of property b"; 
 
console.log(obj.b);

なぜ前のコードが無限ループだったのですか?見てみましょう:set関数の内部

obj.b=12; //this code run set function 

ました:だからset関数が何度も何度も、決して呼ばれ

this.b=value; //this code also runs set function because this===obj 

が停止します。

+0

私はそれを取得しません。どのようにセッターは無限ループにありますか? –

+0

@AtulAgrawal私はいくつかの情報を追加し、今はっきりしているかどうかを確認します。 –

+0

ありがとう、私は今はっきりしています –

関連する問題