MDN 说私有属性是原型继承中没有简单替代方案的特性:
可是不是能用闭包写私有属性吗:
function C() {
// 私有属性
let value = 0;
Object.defineProperty(this, "v", {
get: () => value,
set: (v: number) => value = v,
});
}
es6 类写法:
class C2 {
#value = 0;
get v() {
return this.#value;
}
set v(v) {
this.#value = v;
}
}
这两种写法有什么区别吗?
MDN 的作者措辞还是非常严谨的,“简单替代方案”,也就是说实现类似的功能,道路将会非常曲折。
你的方法已经略显曲折了,但还是没有完全模拟出私有属性该有的样子——如果使用原型链继承的话,所有子类实例的
.v
属性都会指向同一个value
:不过,这并不是你的写法有问题,而是原型链继承的固有缺陷,所以这里要被迫使用构造函数继承,这就偏离了“原型链继承”的语境限制,复杂程度也更上一层楼: