JavaScript中class A extends null语法合法但会切断原型链与Object.prototype的连接,导致实例失去所有基础方法;A仍是函数,A.prototype.__proto__为undefined;new A()实例无法调用toString等方法,instanceof Object为false;构造函数中不可用super(),须手动返回对象。

JavaScript 中 class A extends null 语法合法,但会彻底切断原型链与 Object.prototype 的连接——这不是“继承 null”,而是主动让子类实例跳过默认的对象基底,导致基础方法全部失效。
构造函数仍正常,但原型链被截断
虽然继承自 null,A 仍是标准函数:
-
A.__proto__ === Function.prototype成立,typeof A是"function" -
A.prototype被创建,但它没有上级原型:A.prototype.__proto__ === undefined(不是Object.prototype) - 因此
new A()得到的对象,其__proto__直接指向A.prototype,再往上就是undefined,查找立即终止
实例失去所有 Object.prototype 方法
因为原型链不再经过 Object.prototype,实例无法访问任何默认方法:
-
a.toString()、a.valueOf()、a.hasOwnProperty('x')全部报TypeError -
Object.prototype.isPrototypeOf(a)返回false -
instanceof Object为false,a instanceof A才为true
super() 无法调用,必须手动构造 this
扩展 null 后,派生类构造函数中不能写 super():
立即学习“Java免费学习笔记(深入)”;
-
super()试图调用父构造函数,而null不是函数,直接抛出TypeError: Super constructor null ... is not a constructor - 必须显式返回一个对象,绕过默认的
this初始化机制,例如:return { __proto__: A.prototype } - 否则即使语法通过,运行时也会失败
null 是终止标记,不是可继承对象
要理解这个行为,关键在于:null 在原型链中只起“哨兵”作用,它本身不是对象,不参与继承,也不提供任何能力:
-
Object.prototype.__proto__ === null是规范定义的终点信号,不是“继承自 null” -
extends null实质是让A.prototype.__proto__不再设为Object.prototype,而是留空(undefined),从而跳过整个Object.prototype层 - 这种设计常用于需要纯净哈希对象或避免原型污染的场景,比如
Object.create(null)的类封装


















