欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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高级程序设计。