代码数据循环报错的咨询

lyw2073327 2021-03-31 04:51:27
用如下这个代码,系统会提示报错,必须要把age改成_age才能正常运转,然后就不是很明白为什么要设置为私有变量才能跑起来,想知道下面这段代码的逻辑顺序是怎样的,为什么会导致数据循环,谢谢

<body>
<script>
let data = {
name:'小明',
age:18
}

Object.defineProperty(data,'age',{
get:function(){
return this.age;
}
})

document.getElementById("demo").innerHTML = data.age;
</script>
</body>
...全文
227 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Logerlink 2021-04-06
  • 打赏
  • 举报
回复
是指同一个东西 就是一个普通参数
lyw2073327 2021-03-31
  • 打赏
  • 举报
回复
非常感谢您的详细回答@Logerlink,另外想再咨询下面这种情况,这里的 return language 中的"language"和上面 var 里面的"language"是指同一个东西吗,因为我如果把set这行的代码拿掉,系统就会报错,我原本以为既然是return language,那么假设我不需要修改属性内容,那我把set那行代码和下面的person.language="en"这行代码都删除的话,结果返回还会是"NO",但实际是系统会报错,所以我只能理解为这里的 return language 只是返回一个参数设置,也可以是 return KK,然后下面的set对KK进行设置关联,最后通过 person.language="en"来实例化,请问是这样理解吗
chenrynet 2021-03-31
  • 打赏
  • 举报
回复
return this.age 也是获取age属性的值 也会触发getter
Logerlink 2021-03-31
  • 打赏
  • 举报
回复
Object.defineProperty(data,'age',{ get:function(){ return this.age; } }) 相当于监听"age"属性的get方法即每次获取age的值都会调用get方法 而this.age会触发get方法,从而会进入无限循环

<body>
    <div id="demo"></div>
    <script>
    let data = {
        name:'小明',
        age:18
    }
    let temp = data.age
    Object.defineProperty(data,'age',{
        get: function () {
            console.log('获取data数据')
            return temp
        },
        set:function(value){
            //原有的值加上100
            temp = value + 100
        }
    })
    console.log(data.age)   //控制台会输出 "获取data数据"
    console.log(data.name)  //只会输出值
    //更改age数据
    data.age = 88
    console.log(data.age,'age')
    console.log(JSON.stringify(data),'data')
    document.getElementById("demo").innerHTML = data.age;
    </script>
    </body>
Logerlink 2021-03-31
  • 打赏
  • 举报
回复
Object.defineProperty(data,'age',{ get:function(){ return this.age; } }) 相当于监听"age"属性的get方法即每次获取age的值都会调用get方法,而this.age获取

87,917

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧