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' —— 所有实例都过这一关,毫无区分度。真正可靠的检查方式有:
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 或跨上下文传实例时掉坑里。