javascript的class是原型继承的语法糖,本质为构造函数封装,通过prototype、__proto__和原型链实现继承、方法共享与实例化,所有行为均不改变底层对象模型。

JavaScript 的 class 不是真正意义上的“类”,它只是对原型继承机制的一层简洁封装——也就是常说的“语法糖”。它的所有行为,包括定义、继承、方法共享、实例创建,最终都落回到 prototype、__proto__ 和原型链上。
class 声明本质是构造函数的简写
当你写:
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, ${this.name}`);
}
}
等价于手动定义一个构造函数,并把方法挂到其 prototype 上:
-
Person是一个函数对象,typeof Person === 'function' -
Person.prototype自动拥有constructor属性,指向Person -
greet方法被添加到Person.prototype,所有实例共享该方法 - 必须用
new Person()调用,否则会报错(class 构造器不可直接调用)
extends 实际在操作两条原型链
class Dog extends Animal 并非引入新机制,而是自动完成两处关键连接:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
Dog.prototype.__proto__ === Animal.prototype:让Dog实例能沿原型链访问Animal.prototype上的方法(如eat()) -
Dog.__proto__ === Animal:使子类可继承父类的静态方法(如Animal.create()可被Dog.create()调用) - 这和手动执行
Object.setPrototypeOf(Dog.prototype, Animal.prototype)与Object.setPrototypeOf(Dog, Animal)效果一致
super() 是对父构造函数的显式调用
在子类 constructor 中,super() 必须在使用 this 前调用,它做了三件事:
- 以当前实例(
this)为上下文,执行父类构造函数 - 确保父类初始化逻辑(如赋值
this.name)得以运行 - 不调用
super()会导致ReferenceError: Must call super constructor
instanceof 和原型链判断完全一致
判断 dog instanceof Dog 或 dog instanceof Animal,底层仍是沿着 dog.__proto__ 逐级向上比对:
dog.__proto__ === Dog.prototypeDog.prototype.__proto__ === Animal.prototypeAnimal.prototype.__proto__ === Object.prototype-
Object.prototype.__proto__ === null(链终止)
也就是说,class 没有改变 JavaScript 的运行时对象模型,只是让原型链的组织更清晰、更不易出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










