类语法中,如何在类内部为原型添加共享属性?
ES6类中原型共享值的等价写法与类内部定义原型属性的方案
第一个问题:类语法中与原型添加共享值等价的写法
以前用构造函数模式的时候,我们会这么给原型加共享属性:
function Banana(weight) { this.weight = weight; } Banana.prototype.type = 'fruit'; // 所有Banana实例共享这个type属性
在ES6类语法里,直接在类声明外部操作类的prototype是完全等价的写法:
class Banana { constructor(weight) { this.weight = weight; } } // 和上面构造函数的原型写法效果完全一致 Banana.prototype.type = 'fruit';
不过你提到不想在类外面写这段代码,希望把原型属性和方法就近组织在类内部,那咱们来看第二个问题的解决方案:
第二个问题:在类内部定义原型共享属性的优雅方案
要实现type = 'fruit'挂在原型上,同时不用在类外写代码,推荐用ES2022引入的类静态初始化块。静态块会在类定义完成时自动执行一次,刚好适合在这里给原型添加共享属性,还能和相关方法就近摆放:
class Banana { constructor(weight) { this.weight = weight; // 每个实例独有的重量属性 } // 静态初始化块:类一被定义就执行,给原型加共享属性 static { this.prototype.type = 'fruit'; // 这里的this就是Banana类本身,所以this.prototype就是Banana.prototype } // 和原型属性就近的原型方法 getDescription() { return `这是一个${this.type},重量${this.weight}克`; } } // 测试验证 const bananaA = new Banana(120); const bananaB = new Banana(180); console.log(bananaA.type); // 'fruit' console.log(bananaB.type); // 'fruit' console.log(bananaA.type === bananaB.type); // true,说明是共享的 console.log(bananaA.hasOwnProperty('type')); // false,确认属性在原型上而非实例
如果你的运行环境还不支持ES2022(比如一些旧版本浏览器),可以用个变通方案——在构造函数里只初始化一次原型属性,但这种方式会在每次实例化时做检查,不如静态块优雅:
class Banana { constructor(weight) { this.weight = weight; // 仅在第一次实例化时给原型添加属性 if (!this.constructor.prototype.hasOwnProperty('type')) { this.constructor.prototype.type = 'fruit'; } } getDescription() { return `这是一个${this.type},重量${this.weight}克`; } }
⚠️ 注意:别直接在类里写type = 'fruit',这种是实例属性,每个Banana实例都会生成自己的type副本,不是共享的原型属性,不符合你的需求。
内容的提问来源于stack exchange,提问作者user81993
相关产品推荐
相关产品推荐

