构建现代JS原型链架构需用class/extends/super,避免手动操作__proto__;super()必须在子类构造函数中调用以正确链接原型链;禁用修改内置原型,改用标准API如Object.getPrototypeOf()。

构建符合现代 JS 标准的原型链架构,核心是理解并正确使用 class、extends 和 super,同时保持对底层原型机制的清醒认知——ES6 的类语法是语法糖,本质仍是基于 prototype 和 __proto__ 的原型链。
用 class + extends 明确表达继承关系
避免手动操作 prototype 或 __proto__,改用标准类声明。它自动建立正确的原型链,并确保构造函数、constructor 属性和 [[Prototype]] 指向一致:
- 父类方法定义在
class A { method() {} }内部,会自动挂载到A.prototype - 子类通过
class B extends A声明,JavaScript 自动设置B.prototype.__proto__ === A.prototype - 实例的
__proto__会逐级向上:实例 →B.prototype→A.prototype→Object.prototype→null
确保 super() 被正确调用
在子类构造函数中,必须在访问 this 前调用 super()。这不仅初始化父类状态,还确保实例的内部原型链被正确链接:
- 不调用
super()会导致ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor -
super()内部会执行Object.setPrototypeOf(this, new.target.prototype),这是原型链生效的关键一步 - 若需传参给父类,写成
super(name, age)即可
谨慎扩展内置对象原型
虽然技术上可以向 Array.prototype 或 Object.prototype 添加方法,但现代标准强烈反对直接修改内置原型:
- 破坏封装性,可能与其他库或未来 JS 版本冲突
- 影响性能优化(如 V8 对内置原型有特殊内联缓存)
- 推荐替代方案:使用工具函数、自定义类封装,或通过
Object.assign/Object.create构建新对象
用 Object.getPrototypeOf() 和 Object.setPrototypeOf() 替代 __proto__
__proto__ 是非标准、已废弃的访问器属性。现代代码应使用标准 API:
- 读取原型链:用
Object.getPrototypeOf(obj)(等价于obj.__proto__,但规范、安全) - 设置原型(仅限调试或极少数场景):用
Object.setPrototypeOf(obj, proto),而非赋值obj.__proto__ = proto - 检查是否在链上:用
obj instanceof Constructor或Constructor.prototype.isPrototypeOf(obj)


















