用如下這個代碼,系統會提示報錯,必須要把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>
uj5u.com熱心網友回復:
Object.defineProperty(data,'age',{get:function(){
return this.age;
}
})
相當于監聽"age"屬性的get方法即每次獲取age的值都會呼叫get方法,而this.age獲取
uj5u.com熱心網友回復:
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>
uj5u.com熱心網友回復:
return this.age 也是獲取age屬性的值 也會觸發getteruj5u.com熱心網友回復:
非常感謝您的詳細回答@Logerlink,另外想再咨詢下面這種情況,這里的 return language 中的"language"和上面 var 里面的"language"是指同一個東西嗎,因為我如果把set這行的代碼拿掉,系統就會報錯,我原本以為既然是return language,那么假設我不需要修改屬性內容,那我把set那行代碼和下面的person.language="en"這行代碼都洗掉的話,結果回傳還會是"NO",但實際是系統會報錯,所以我只能理解為這里的 return language 只是回傳一個引數設定,也可以是 return KK,然后下面的set對KK進行設定關聯,最后通過 person.language="en"來實體化,請問是這樣理解嗎
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/270394.html
標籤:JavaScript
