为何自动创建以‘_’开头的属性?类getter/setter逻辑疑问
关于JavaScript类中下划线前缀属性的疑问解答
咱们一步步拆解你的问题,把这些疑惑说清楚:
1. 为什么会自动创建_name属性?为什么没报错?
在JavaScript里,当你给类定义了get name()和set name()时,name就变成了一个「访问器属性」,而非普通的数据属性。这时候你在构造函数里写this.name = name,本质是在调用你定义的set name()方法,不是直接给this添加name数据属性。
你的set name(value)方法里明确写了this._name = value——这就相当于你手动给实例添加了_name属性。JavaScript是动态类型语言,对象的属性不需要提前声明,只要赋值就会自动创建,这是它的特性,所以不会抛出错误。说白了,不是“自动创建”,是你通过setter间接创建了它~
2. 为什么输出不是Tom/Tom/Tom?
先看代码的执行逻辑:
class Person{ constructor(name){ this.name=name; // 调用set name("Tom"),给this._name赋值为"Tom" } get name(){ return this._name; // 每次访问name,都返回this._name的值 } set name(value){ this._name=value; // 每次给name赋值,都修改this._name } sayName(){ console.log(this.name); // 调用get name(),返回当前的this._name } } var person=new Person("Tom"); console.log(person.name); // 调用get,此时this._name是"Tom",输出Tom person.name="Huck"; // 调用set,把this._name改成"Huck" console.log(person.name); // 调用get,此时this._name是"Huck",输出Huck person.sayName(); // 同样调用get,输出Huck
你之所以觉得应该是三个Tom,是忽略了person.name="Huck"这一步的作用——它通过setter把_name的值改成了Huck,之后所有访问person.name的地方,都会返回修改后的_name。如果删掉person.name="Huck"这行,输出才会是Tom/Tom/Tom。
内容的提问来源于stack exchange,提问作者SM J
相关产品推荐
相关产品推荐

