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

JavaScript类添加非方法属性及PGroup不可变集合实现相关问题

问题1:为什么仅需要一个PGroup.empty值,而非每次调用函数生成新的空实例?

因为PGroup是不可变类,所有修改操作(add/delete)都不会改动原实例,只会返回新实例。空的PGroup实例本身没有任何可修改的状态,不管多少地方复用这个空实例,都不会出现互相影响的情况,所以全局只需要保留一个空实例就足够使用,没必要每次都生成新的空实例浪费内存。

问题2:忽略作者给构造函数传空数组的差异,我实现的empty静态getter方法和作者的empty属性是否等价?

不等价。你的静态getter每次调用PGroup.empty都会生成一个全新的PGroup实例,而作者的写法是只在类定义完成后生成一次空实例,后续所有访问PGroup.empty拿到的都是同一个实例。虽然在这个习题的测试用例里两种写法运行结果没区别,但本质行为不一样,你的写法其实违背了“只需要一个空实例”的设计初衷。

问题3:作者的代码中为什么将PGroup.empty属性定义在类的外部?

因为《Eloquent JavaScript(第三版)》成书的时候,ES6的class语法还不支持直接在类内部声明静态属性,ES2022才正式引入了类静态字段的写法,所以当时的标准写法就是在类定义完成后,直接给类对象挂载属性。如果是现在的新标准写法,完全可以在类内部写static empty = new PGroup([]);,效果和外部定义完全一致。

问题4:如何在JavaScript类中添加不属于方法的属性?

分两种场景:

  • 静态属性(挂载在类本身的属性,比如PGroup.empty):支持ES2022的环境可以直接在类内部用static 属性名 = 值的写法声明;兼容旧环境就和作者的写法一样,在类定义完成后用类名.属性名 = 值赋值。
  • 实例属性(每个实例独有的属性):ES2022可以直接在类内部写属性名 = 初始值声明,也可以在constructor内部用this.属性名 = 值赋值,后者兼容性更好。

内容的提问来源于stack exchange,提问作者walexy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:27:03