带Getter的Property_1是否持有Property_2的值或引用?对象场景解析
好问题!咱们一步步把这几个点拆解明白:
1. Property_1是否持有Property_2的副本?
完全不会。Getter属性的本质是一个被自动执行的函数,它本身并不存储任何值。每次你访问Property_1的时候,都会触发Getter函数的执行,函数里的逻辑是去读取Property_2的当前值然后返回——相当于每次都是“实时调取”,不会把Property_2的值存在Property_1里留副本。
举个JavaScript的例子直观感受下:
const myObj = { // 用下划线标识内部存储的Property_2值 _property2: 5, // Property_2的Getter/Setter(如果需要的话) get property2() { return this._property2; }, set property2(newVal) { this._property2 = newVal; }, // Property_1的Getter,依赖Property_2 get property1() { console.log("Property_1的Getter正在执行!"); return this.property2; } }; console.log(myObj.property1); // 先打印日志,再输出5 myObj.property2 = 15; console.log(myObj.property1); // 再次打印日志,输出15
你看,每次访问property1都会触发日志打印,说明Getter每次都在执行,而且返回的是property2的最新值,根本没有存副本。
2. 当Property_2是对象引用时,Property_1拿到的是独立引用吗?
不是。这里要搞清楚:对象在内存里是一个实体,变量(或属性)存的只是指向这个实体的引用地址。当Getter返回Property_2的引用时,它返回的是同一个地址——也就是说,Property_1拿到的引用和Property_2的引用指向的是同一个对象,并不是独立的副本。
还是用代码举例:
const myObj = { _property2: { age: 25 }, get property2() { return this._property2; }, get property1() { return this.property2; } }; // 从Property_1拿到对象引用 const objFromProp1 = myObj.property1; // 修改这个对象的属性 objFromProp1.age = 30; // 查看Property_2对应的对象 console.log(myObj.property2.age); // 输出30!
这就证明了,Property_1和Property_2的引用指向同一个对象,修改其中一个,另一个也会看到变化。如果是独立引用的话,修改objFromProp1的属性不会影响myObj.property2的对象。
总结一下
- Getter属性本身不存储任何值,每次访问都会执行Getter逻辑,实时获取
Property_2的当前值,无副本。 - 当
Property_2是对象时,Property_1返回的是同一个对象的引用,并非独立引用,操作对象会影响两边。
内容的提问来源于stack exchange,提问作者LeBrown Jones
相关产品推荐
相关产品推荐

