JavaScript 中的 class 是函数语法糖,其继承本质依赖原型链;class 不提升、必须用 new 调用;子类 constructor 必须先调 super();static 成员不实例化但可被子类继承;手动修改 prototype 会破坏 instanceof 判断。

JavaScript 中的 class 本质是函数语法糖,直接用它写继承不等于“面向对象正确”,关键在理解原型链如何被隐式操作。
class 声明不会提升,且必须用 new 调用
和普通函数不同,class 声明不会被提升(hoisted),且不能当普通函数调用:
-
new MyClass()✅ 正常实例化 -
MyClass()❌ 报错:TypeError: Class constructor MyClass cannot be invoked without 'new' -
console.log(MyClass)在声明前访问 →ReferenceError
这和 function 声明行为完全不同,容易在迁移旧代码时踩坑。
extends 必须配合 super(),且 super() 要在 this 使用前调用
子类构造函数中,只要写了 constructor,就必须显式调用 super();否则 this 不可用:
立即学习“Java免费学习笔记(深入)”;
class Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
// ❌ 缺少 super() → ReferenceError: Must call super constructor
this.breed = breed; // ← this 尚未初始化
}
}
正确写法:
class Dog extends Animal {
constructor(name, breed) {
super(name); // ✅ 必须第一句
this.breed = breed; // ✅ this 现在可用
}
}
如果父类构造函数需要参数,super() 必须传参;漏传或类型错,会导致父类属性缺失或逻辑异常。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
static 方法和属性不会被继承到实例,但可被子类继承
static 成员属于类本身,不进入原型链:
-
Dog.staticMethod()✅ 可以调用(如果Dog自己定义或从Animal继承) -
dogInstance.staticMethod()❌ 实例上不存在 -
class Dog extends Animal { }→Dog会继承Animal.staticMethod,但不是通过原型链,而是 JavaScript 引擎特殊处理的“静态继承”
注意:静态方法中 this 指向当前类(如 Dog),不是实例,所以适合做工厂、工具逻辑,不适合访问实例状态。
继承后原型链没断,但 instanceof 和 isPrototypeOf 行为要小心
看似继承了,但若手动改过 Child.prototype(比如赋值为 Object.create(Parent.prototype)),可能破坏 instanceof 判断。而原生 class + extends 会自动设置好 __proto__ 链:
-
new Dog() instanceof Dog✅ -
new Dog() instanceof Animal✅(因为Dog.prototype.__proto__ === Animal.prototype) - 但如果在
class Dog extends Animal后又执行Dog.prototype = {...},上述instanceof Animal会变false
这种手动覆盖原型的操作,在 class 语法下几乎总是错误的——该用 Object.assign(Dog.prototype, {...}) 或装饰器模式补方法,而不是替换整个 prototype。
真正难的不是写 extends,而是意识到所有继承行为最终都落在 [[Prototype]] 链上;class 只是让这条链更可控,也更容易因忽略隐式规则而出错。










