2016-09-06 120 views
1

我已經定義了一個對象並使用javascript的defineProperty方法定義了一個屬性。無法使用defineProperty方法在對象中設置屬性

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

,但是當我使用下面的語句設置b的值

obj.b = 25 

它給我

的RangeError:最大調用堆棧大小超過

如何設置b的值?

+0

從'b'刪除'this'。在set方法中將其設置爲'b = value',讓我知道是否有效。 –

+0

這是你的瀏覽器?它是否與defineProperty兼容? –

+0

我沒有在瀏覽器上執行此操作。我正在使用節點的repl。 @RicardoPontual –

回答

2

您正在使用的setter無限遞歸循環,內部二傳手代碼會被再次使用它:

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

將其改爲任意不同的變量名,如:

this.bVal=value; 

所有代碼:

//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);

爲什麼以前的代碼是無限循環?請看:

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

裏面set功能是:

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

所以set功能被一而再,再而從來沒有所謂的停止。

+0

我只是不明白。 setter如何處於無限循環? –

+0

@AtulAgrawal我添加了一些信息,檢查它是否現在清除。 –

+0

謝謝,我現在很清楚 –

相關問題