ES6中class A extends null语法合法但会截断原型链:A.__proto__仍为Function.prototype,A.prototype.__proto__为undefined,实例无toString等Object方法,需手动补全。

ES6 中 class A extends null 是语法上合法的,但会触发特殊继承行为:子类不再继承自 Object,其原型链被主动截断。
构造函数层面:__proto__ 仍指向 Function.prototype
尽管继承自 null,A 本身仍是函数,所以:
-
A.__proto__ === Function.prototype(成立) -
typeof A仍是"function" - 它能被
new调用,返回一个普通对象
原型层面:prototype 的 __proto__ 为 undefined
关键区别在于实例的原型链起点被移除:
-
A.prototype.__proto__ === undefined(不是Object.prototype) - 因此,
new A()创建的实例没有toString、hasOwnProperty等默认方法 - 该实例的
__proto__直接指向A.prototype,而A.prototype没有上级原型
运行时表现:失去所有 Object.prototype 方法
尝试调用基础方法会报错:
-
const a = new A(); a.toString()→TypeError: a.toString is not a function -
a.hasOwnProperty、a.valueOf等均不可用 - 但可手动在
A.prototype上添加方法,这些方法仍可被实例访问
用途与注意事项
这种写法极少用于业务代码,主要出现在底层机制探索或极简对象建模场景中:
- 适合构建“纯净”对象,避免隐式继承带来的干扰(如调试时减少原型链污染)
- 不能依赖任何默认对象行为,需自行补全必要方法
- 与
Object.create(null)效果类似,但通过 class 语法实现,更显式


















