JavaScript的类是基于原型的语法糖,class声明本质是函数加prototype操作,实例属性须在constructor中用this显式初始化,继承必须正确调用super()以维护原型链。

JavaScript 的类和继承不是传统面向对象语言那种“编译时确定的类型系统”,而是基于原型(prototype)的语法糖——class 关键字本身不创建新机制,只是让原型链操作更可读、更结构化。
class 声明本质是函数 + prototype 操作
class 声明会被 JavaScript 引擎转为一个具有 constructor 属性的函数,并自动设置其 prototype。你不能在 class 内部用 = 直接给实例赋值成员变量(像 Python 那样),所有实例属性必须在 constructor 中通过 this.xxx = 显式初始化。
-
class Person {}等价于function Person() {},且Person.prototype自动存在 - 类方法(如
sayHello())被添加到Person.prototype上,不是每个实例都拷贝一份 - 类中不允许写
var name = 'xxx'这样的语句;静态属性需用Person.version = 1或static version = 1(ES2022+)
extends 和 super 的调用顺序很关键
子类构造函数中,必须在访问 this 前调用 super()——否则会抛出 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor。这是因为子类实例的内部槽([[Prototype]])依赖 super() 来正确链接到父类原型。
-
super()必须出现在constructor第一行(或至少在任何this访问之前) -
super.xxx可用于访问父类原型上的方法,但不能在super()调用前使用 - 如果子类没写
constructor,引擎会自动注入constructor(...args) { super(...args); }
继承链断裂常见于手动改写 prototype
直接赋值 Child.prototype = Parent.prototype 或 Child.prototype = new Parent() 是危险操作:前者会让子类修改影响父类,后者可能触发父类构造函数副作用(比如发请求、改全局状态),且无法正确设置 constructor 指针和 __proto__ 链。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
立即学习“Java免费学习笔记(深入)”;
- 正确做法始终是用
extends,它底层调用Object.setPrototypeOf(Child.prototype, Parent.prototype) - 若必须手写继承(如兼容老环境),应使用
Object.create(Parent.prototype)并重设constructor -
instanceof判断依赖原型链,手动改错prototype会导致new Child() instanceof Parent === false
真正容易被忽略的是:类字段声明(name = 'x')属于 ES2022 提案,Babel 默认不编译它为可兼容代码;而 static 字段、私有字段(#age)的运行时行为与普通属性完全不同——它们不走 prototype,也不参与 for...in 遍历。别假设“写了 class 就等于 Java 那套”。










