class 是函数和原型链的语法糖,本质仍是构造函数,实例的 proto 指向类的 prototype,类的 proto 指向父类,static 方法通过构造器链继承,原型链机制未变。

现代 JavaScript 的 class 语法是函数和原型链的语法糖,它没有改变底层机制,只是让面向对象写法更清晰。理解 class 背后的原型链,关键在于记住:**class 声明依然基于构造函数和 prototype 对象,所有继承关系最终都落在 __proto__ 和 prototype 的连接上。**
class 声明本质仍是函数
用 class 定义的类,在运行时就是一个普通的函数(尽管不可被当作普通函数调用):
-
class Person {}等价于function Person() {},只是多了内部标识[[IsClassConstructor]]: true; -
Person.prototype依然存在,且所有实例方法(如sayHello())都会被添加到这个对象上; -
new Person()创建的实例,其__proto__指向Person.prototype。
constructor、prototype 和 __proto__ 的对应关系
以一个简单例子说明三者关系:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a sound');
}
}
-
Animal.prototype.constructor === Animal→ 构造器指向自身; -
Animal.prototype.speak是方法定义的位置; -
const dog = new Animal('Dog');后:
→dog.__proto__ === Animal.prototype;
→dog.constructor === Animal(通过Animal.prototype.constructor查找);
→Animal.prototype.__proto__ === Object.prototype(因为Animal是普通函数,其 prototype 默认继承自Object)。
extends 实现的是原型链的向上延伸
extends 不是“复制”父类,而是建立两条关键原型链:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
实例链:子类实例 → 子类 prototype → 父类 prototype →
Object.prototype→null; -
构造器链:子类 →
ParentClass(即SubClass.__proto__ === ParentClass),这使得static方法可继承。
例如:
class Dog extends Animal {
bark() { console.log('Woof!'); }
}
-
Dog.prototype.__proto__ === Animal.prototype(保证实例能访问speak); -
Dog.__proto__ === Animal(保证Dog.method()可以继承Animal.method()); -
new Dog().__proto__.__proto__ === Animal.prototype,再往上就是Object.prototype。
static 方法和属性走的是构造器链,不是实例链
static 成员不会出现在 prototype 上,而是直接挂在类函数本身:
-
class A { static foo() {} }→A.foo存在,但A.prototype.foo为undefined; - 由于
Dog.__proto__ === Animal,所以Dog.staticMethod能沿__proto__查找到Animal.staticMethod; - 但
new Dog().staticMethod会是undefined,因为它不走__proto__链,而走的是实例自身的属性查找(然后才查原型,但 static 不在原型上)。
class 让语法更简洁,但原型链没变——它只是把 function、prototype、__proto__ 这套逻辑包装得更易读。只要记住「实例的 __proto__ 指向类的 prototype,类的 __proto__ 指向父类」,就能稳稳把握继承本质。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










