Object.defineProperty 栈溢出
程序员文章站
2022-07-12 21:55:30
...
要修改Property的attribute值,只能使用ECMAScript的Object.defineProperty()方法。
在学习过程中,我敲入以下代码:
var person = {
name:'xiao',
age:18
}
Object.defineProperty(person, 'age', {
set:function(newValue){
this.age=newValue;
},
get:function(){
return this.age;
}
});
ok,已经完成了person对象的age属性的访问器属性。接下来给person.age赋值:
person.age = 20;
猝不及防,问题出现了:
Uncaught RangeError: Maximum call stack size exceeded
at Object.set [as age] (<anonymous>:1:51)
at Object.set [as age] (<anonymous>:1:70)
at Object.set [as age] (<anonymous>:1:70)
at Object.set [as age] (<anonymous>:1:70)
at Object.set [as age] (<anonymous>:1:70)
at Object.set [as age] (<anonymous>:1:70)
at Object.set [as age] (<anonymous>:1:70)
at Object.set [as age] (<anonymous>:1:70)
at Object.set [as age] (<anonymous>:1:70)
at Object.set [as age] (<anonymous>:1:70)
具体的原因我不清楚,但可以参考该博客
最终的解决方法是:
var person = {
name:'xiao',
_age:18
}
Object.defineProperty(person, 'age', {
set:function(newValue){
this._age=newValue;
},
get:function(){
return this._age;
}
});
ps:细心的人可以看出,我在person定义了一个_age,在age前面加了下划线。这是一种常用的记号,用来表示该变量是对象方法使用的(set、get等内部方法)。我的理解是最好不要直接在外部直接person._age。这个知识点来自JavaScript高级程序设计。