javascript原型系统是运行时行为的核心机制,需清晰可控地使用:明确构造函数与prototype职责,共享方法挂载prototype,避免污染内置原型,优先用class语法和object.setprototypeof,用instanceof/isprototypeof检测关系。

JavaScript 原型系统不是“过时的语法糖”,而是运行时行为的核心机制。写好原型相关代码,关键不在回避它,而在于用得清晰、可控、可预期。
明确构造函数与 prototype 的职责边界
每个函数(除箭头函数外)默认拥有 prototype 属性,它是实例对象的原型来源;而每个对象都有内部属性 [[Prototype]](可通过 __proto__ 访问),指向其继承链上的上一级原型。
- 只在构造函数的
prototype上添加**共享方法和可复用属性**,避免在每次new时重复创建 - 不要直接修改内置构造函数(如
Array.prototype或Object.prototype)——这属于“修改不属于你的对象”,极易引发冲突 - 若需扩展能力,优先封装为独立工具函数,或使用
class+static方法替代原型污染
用 class 语法代替手写 prototype 链,但理解其本质
class 是原型机制的语法糖,不是新继承模型。它让意图更清晰,也天然规避部分常见错误。
- 用
extends实现继承时,子类constructor中必须调用super(),否则无法访问this - 静态方法(
static)挂载在类本身,不参与原型链查找;实例方法自动定义在ClassName.prototype上 - 避免混用:
function Foo(){}后再手动改Foo.prototype = {...},易与后续class Foo冲突,统一风格更安全
避免依赖 __proto__ 进行运行时修改
__proto__ 是非标准(尽管被广泛支持)且性能敏感的属性。它允许动态改变对象原型,但会破坏引擎优化(如内联缓存),并使代码难以追踪。
- 需要多态行为时,优先用组合(composition)或策略模式,而非运行时切换原型
- 若必须设置原型,使用标准方法
Object.setPrototypeOf(obj, proto),并在必要时加注释说明原因 - 测试或调试中可读取
obj.__proto__辅助理解,但生产代码中不应依赖它做逻辑分支
检查原型关系时,用 instanceof 和 isPrototypeOf() 而非硬比 __proto__
直接比较 a.__proto__ === B.prototype 脆弱且不可靠(如子类实例对父类构造器返回 true,但对祖父类就可能失效)。
- 判断对象是否由某构造器创建:用
obj instanceof Constructor - 判断某原型是否在对象原型链中:用
Constructor.prototype.isPrototypeOf(obj) - 检测对象自身是否有某属性(不含原型链):用
Object.hasOwn(obj, 'prop')(ES2022+)或hasOwnProperty.call(obj, 'prop')
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











