JavaScript的class是原型机制的语法糖,instanceof通过检查原型链判断类型;new执行四步初始化流程;可靠类型判断用MyClass.prototype.isPrototypeOf(obj)。

JavaScript 面向对象编程不是“模拟类”,而是基于原型的机制;class 只是语法糖,背后仍是 prototype 和 new 的行为。
为什么用 class 写出来的代码,instanceof 仍能认出类型?
因为 class 声明会自动设置构造函数的 prototype.constructor,并让 new 创建的对象隐式链接到该 prototype。这和手写函数 + MyClass.prototype.xxx = function(){} 效果一致。
-
class不创建新继承模型,只是让原型链操作更可读 -
instanceof检查的是对象的原型链上是否存在右侧构造函数的prototype - 删除
MyClass.prototype.constructor后,instanceof仍可能为true,只要原型链没断
new 调用时,JavaScript 引擎实际做了什么?
执行 new MyClass() 不是“实例化类”,而是触发四步原型初始化流程:
- 创建一个空对象,其
__proto__指向MyClass.prototype - 以该对象为
this,执行MyClass构造函数 - 若构造函数显式返回对象,则使用该对象;否则返回第一步创建的对象
- 注意:
return {}会覆盖默认返回,return 123或return undefined则无效
如何判断一个值是“类的实例”,而不是普通对象?
别只依赖 typeof obj === 'object' —— 所有实例都过这一关,毫无区分度。真正可靠的检查方式有:
立即学习“Java免费学习笔记(深入)”;
- 用
obj instanceof MyClass:适用于同一全局环境,跨 iframe 失效 - 用
Object.prototype.toString.call(obj) === '[object MyClass]':不行,toString不识别自定义类名 - 正确做法:
obj.constructor === MyClass(但可被篡改)或MyClass.prototype.isPrototypeOf(obj)(更健壮,不依赖constructor) - 现代补充:
obj?.[Symbol.toStringTag] === 'MyClass'可用于自定义console.log输出,但不影响类型判断逻辑
原型链看不见、摸不着,但每次 obj.method() 查找时都在走它;写 class 很方便,但忘了它底层仍是对象和链接,就容易在动态修改 prototype 或跨上下文传实例时掉坑里。











