3 个回答

楼上说得对。正确的用法是在外部设置一个变量

let obj = {}
let initName = ''
Object.defineProperty(obj, 'name', {
    get () {
        return initName
    },
    set (newVal) {
        initName = newVal
    }
})

obj.name = val 会调用 setter 。于是无限递归了。

在set中不能再去赋值,obj.name = val这个语句首先触发了get,然后赋值又触发了set,set又执行obj.name = val,于是就无限调用了

而且你写的这个get也会导致无限调用,因为obj.name会触发get

一般要定义defineProperty都需要借助一个外部变量:

let name;
let obj = {};
Object.defineProperty(obj,"name",{
    get(){ return name },
    set(val){ name=val }
})

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏