JavaScript的class是原型机制的语法糖,本质仍基于prototype;它不可提升、方法不可枚举,继承需super()初始化this并确保__proto__链正确,new操作符遵循四步流程,误用会破坏原型链。

JavaScript 里没有传统意义上的“类”(class),class 关键字只是语法糖,底层仍是基于原型(prototype)的面向对象机制。直接用 class 写代码没问题,但一旦遇到继承链异常、this 绑定丢失、子类调用父类方法失败等问题,不理解原型本质就很难定位。
class 是什么?它和 function 构造函数有什么区别?
class 是 ES6 引入的声明方式,看起来像 Java/C++ 的类,但行为完全由原型系统支撑。它不能被提升(hoisting),且内部方法默认不可枚举;而传统构造函数是普通函数,可被提升,prototype 上挂的方法默认可枚举。
-
class Person声明后,Person.prototype.constructor === Person仍成立,说明它只是构造函数的包装 -
class中定义的方法会自动设为non-enumerable,而function Person() {} Person.prototype.say = function() {}挂的方法默认是可枚举的 - 箭头函数不能用作
class方法(会报错),但可以写在 class 内部作为实例属性:say = () => {}(需实验性语法支持)
如何正确实现继承?为什么 extends + super 容易出错?
用 extends 声明子类时,必须在 constructor 中第一行调用 super(),否则访问 this 会抛出 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor。
-
super()不仅初始化父类this,还确保__proto__链正确:子类实例 → 子类原型 → 父类原型 →Object.prototype - 若父类构造函数接受参数,
super(name, age)必须传参,漏传可能导致父类属性未初始化 - 静态方法不会被继承到实例上,但可通过
SubClass.superStaticMethod()调用;想让子类实例访问,得显式绑定或重写
new 实例化时发生了什么?为什么有时 new 后返回的不是预期对象?
执行 new Person() 时,JS 引擎实际做了四件事:创建空对象 → 将其 __proto__ 指向 Person.prototype → 以该对象为 this 执行构造函数 → 若构造函数返回对象,则返回该对象,否则返回新创建的对象。
Flash ActionScript3 高级教程 pdf,书籍部分目录: 第一章 高级 碰撞检测 不规则图形的检测碰撞 BitmapData.hitTest用于非位图 大量对象的碰撞检测 实现基于网格的碰撞检测 编写网格代码 测试并调整网格 使用此类 检测不只是为了碰撞 第二章 转向 行为 2D向量(Vector2D)类 机车(Vehicle)类 转向机车(SteeredVehicle)类 寻找行为 避开行为 到达行为
立即学习“Java免费学习笔记(深入)”;
- 如果构造函数
return { name: 'xxx' },那new Person()结果就是这个字面量对象,**忽略原型链** - 如果
return 123或return undefined,则忽略返回值,正常返回实例 - 箭头函数不能用
new调用,会立即报错TypeError: xxx is not a constructor
什么时候该用 class?什么时候该避开?
当需要清晰表达层级关系、复用初始化逻辑、配合 instanceof 类型判断,或对接 TypeScript/React class 组件时,class 是合理选择。但它掩盖了原型细节,调试时容易误判对象来源。
- 纯工具函数集合(如
MathUtils)没必要封装成 class,导出普通对象更轻量 - 需要动态修改原型方法或手动控制
__proto__时,直接操作Constructor.prototype更可控 - 在严格模式下,
class内部的this不再自动绑定,事件回调中仍需.bind(this)或使用箭头函数属性
真正卡住人的,往往不是 class 怎么写,而是错误地把 JS 的原型继承当成“模拟 Java 类”,结果在 for...in 遍历时发现多了不该有的方法,或在 Object.assign({}, instance) 后丢失行为——这些都不是 class 的问题,是没意识到它背后那个沉默的 prototype。










