为什么 MDN 说原型继承中不能有私有属性?-灵析社区

WhatUpDanger

[MDN](https://link.segmentfault.com/?enc=XN8%2FpUHoCwjXCRSULTzZAw%3D%3D.liEvU44pcEDs2fiOEf6fU%2FkFPUZvd3ZOeuL%2Fns6IUMOH7nqwtYm4NLxH17HZ9P6zEfiHtefzZoaQfhYJej4pXg0heU1KjG%2FoVMKezKr60yafVvqr4tz2xjxmGAwBAgEab3Ip4S20pwJvVyoh5NAwJXIvmIWTcXw7d1ywpqUmzwCLZuGgHwhNKLUbFt6g%2F7ly%2BY4pBHjzNSmqjBADCzPffPc8wg%2B1KyVHNhN2cUqtwseFRGkUeY05kNLtuM%2FqzKghk%2FFDJq9S5GHzEdk115jkBg7L5GIC68uYSQpgG%2B3OXn8tGiWuok7rpqRRMZoxhaaF9JGikHJTbz90iPWeruVR7w%3D%3D) 说私有属性是原型继承中没有简单替代方案的特性: ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250103/de665d2b7807ce216d4a2d38fd66489f.png) 可是不是能用闭包写私有属性吗: 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; } } 这两种写法有什么区别吗?

阅读量:324

点赞量:11

问AI
MDN 的作者措辞还是非常严谨的,“简单替代方案”,也就是说实现类似的功能,道路将会非常曲折。 你的方法已经略显曲折了,但还是没有完全模拟出私有属性该有的样子——如果使用原型链继承的话,所有子类实例的 ".v" 属性都会指向同一个 "value": function SubC (){} SubC.prototype = new C(); var subC1 = new SubC(); var subC2 = new SubC(); // 注意这里修改的是 subC1.v subC1.v = 10086; // 注意这里打印的是“没被修改”的 subC2.v console.log(subC2.v) // 10086 不过,这并不是你的写法有问题,而是原型链继承的固有缺陷,所以这里要被迫使用构造函数继承,这就偏离了“原型链继承”的语境限制,复杂程度也更上一层楼: function SubC1 (){ C.call(this); } SubC.prototype = new C();