关于getter和setter还是不懂
来源:3-5 getter 与 setter(2)
soso_crazy
2019-07-05 21:50:02
<!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>这里set 和 get起到的作用是什么?修改实例化对象的name属性吗?
为什么在控制台打印 p.name的结果是“我的名字叫小明”,而不是“小张”。得到的结果为什么不是constructor里对实例化对象this.name=name,然后传入“小张”参数?
为什么实例化后的对象p的属性_name:"小明",而name属性变成不可枚举属相为什么会变成不可枚举属性?,name:“我的名字叫小明”?
var p = new Person('小张', 25)传入的小张去哪了?为什么不是p.name:"小张"?
1回答
樱桃小胖子
2019-07-06
1、ES6在“类”的内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为
2、ES6中,当this.name中的属性名和set name/get name后面的name一致,this.name就会调用setter/getter,而真实的存储变量是_name,所以这里获取的不是constructor里对实例化对象this.name=name

3、这个跟setter/getter的调用执行时机有关系,当你调用p._name的时候,执行的是setter,不执行getter。
4、小张和小明同时传递进了sayName()方法里面,如果需要获取小张,则需要在var p = new Person('小张', 25)p.sayName()后面执行打印,这样才能打印出小张
希望可以帮到你,如果还有疑问,可以再次提问
相似问题