You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何自动创建以‘_’开头的属性?类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:42:02