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

谢谢,我现在很清楚 –

相关问题