其他
需要创建大量同类型对象并共享方法/属性时…
当许多同类型对象需要共享方法或属性时,使用 JavaScript 原型链、ES6 class 和 Object.create() 实现属性共享与继承。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 57/100 ×0.15
适用场景
需要创建大量同类型对象并共享方法/属性时通用
解决思路
- 使用 ES6 class 定义对象类型;把每个实例独有的数据放在 constructor 中赋值(例如 `this.name = name`),把共享方法定义在 class 主体中(例如 `bark()`),这些方法会自动添加到 prototype。
- 用 `new Dog("Daisy")`、`new Dog("Max")`、`new Dog("Spot")` 等方式创建多个实例,实例共享 class 原型上的方法。
- 通过构造函数的 `prototype` 属性(如 `Dog.prototype`)或实例的 `__proto__` 属性(如 `dog1.__proto__`)查看原型对象,确认 constructor 和共享方法位于原型上。
- 访问对象属性时,如果对象自身没有该属性,就让 JavaScript 沿 prototype chain 向下查找,直到在原型链中找到该属性。
- 当多个对象应共享同一属性时,不要给每个实例创建副本,而是把该属性添加到 prototype,因为所有实例都能访问 prototype 对象。
- 在创建实例之后,仍可向 prototype 添加属性或方法(例如添加 `play`),已创建实例也能通过原型链访问这些新增成员。
- 使用 ES6 class 的 `extends` 关键字实现继承(例如 `class SuperDog extends Dog`),在子类 constructor 中调用 `super(name)`,并在子类中添加新方法(例如 `fly()`),从而继承父类方法并扩展新能力。
- 理解 prototype chain 可以有多步:prototype 自身也有 `__proto__`;例如 `SuperDog.prototype` 的 `__proto__` 指向 `Dog.prototype`,访问不存在于当前对象的属性时会递归沿所有 `__proto__` 指向的对象查找,直到找到该属性。
- 使用 `Object.create()` 创建新对象并显式指定其 prototype(例如先定义含 `bark()` 的 `dog` 对象,再 `const pet1 = Object.create(dog);`),让新对象通过 prototype chain 访问指定原型上的属性。
- 用原型模式让对象访问并继承其他对象的属性,避免方法和属性重复,从而减少内存使用。
适用边界 · 注意事项
- 不要将每个实例独有的可变状态放在 prototype 上,否则所有实例会共享该状态;此类状态应在 constructor 中作为实例属性设置。
- 当对象数量很少或不需要共享方法/属性时,引入原型链可能增加理解和调试成本,收益有限。
- 当组合关系更合适时,不要为了复用而强行使用深层的原型继承,以免增加属性查找和调试复杂度。