关于getter和setter还是不懂

关于getter和setter还是不懂

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<script>
class Person {
constructor(name, age) {
this.name = name
this.age = age
}
set name(name) {
this._name = name
}
get name() {
return `我的名字叫${this._name}`
}

// 加一个成员方法
sayName() {
console.log(this.name)
}
}

var p = new Person('小张', 25)
p.sayName()
p.name = '小明'
p.sayName()
</script>
</body>
</html>
  1. 这里set 和 get起到的作用是什么?修改实例化对象的name属性吗?

  2. 为什么在控制台打印 p.name的结果是“我的名字叫小明”,而不是“小张”。得到的结果为什么不是constructor里对实例化对象this.name=name,然后传入“小张”参数?

  3. 为什么实例化后的对象p的属性_name:"小明",而name属性变成不可枚举属相为什么会变成不可枚举属性?,name:“我的名字叫小明”?

  4. var p = new Person('小张', 25)传入的小张去哪了?为什么不是p.name:"小张"?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
卡布琦诺 2019-07-06 16:47:08

1、ES6在“类”的内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为

2、ES6中,当this.name中的属性名和set name/get name后面的name一致,this.name就会调用setter/getter,而真实的存储变量是_name,所以这里获取的不是constructor里对实例化对象this.name=name

http://img1.sycdn.imooc.com//climg/5d205deb00011b6e14720583.jpg

3、这个跟setter/getter的调用执行时机有关系,当你调用p._name的时候,执行的是setter,不执行getter。

4、小张和小明同时传递进了sayName()方法里面,如果需要获取小张,则需要在var p = new Person('小张', 25)p.sayName()后面执行打印,这样才能打印出小张

希望可以帮到你,如果还有疑问,可以再次提问


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师