JavaScript中不存在“原型对象”这种严格类型,所谓原型对象只是被其他对象用作[[Prototype]]的普通对象;判断依据是它是否被其他对象的原型链引用,如proto.isPrototypeOf(obj)返回true即表明proto当前充当原型对象。

JavaScript 中没有“原型对象”这种严格类型,所谓原型对象,只是被其他对象用作 [[Prototype]] 的普通对象。判断一个对象是否“充当原型”,关键看它是否被别的对象继承,而不是看它自身有什么特殊标记。
看它是否被其他对象的原型链引用
一个对象是否实际起到原型作用,取决于有没有对象以它为直接或间接原型。最直接的方式是:用 Object.getPrototypeOf() 检查其他对象的原型链中是否包含它。
- 例如:
const proto = { x: 1 }; const obj = Object.create(proto);→proto.isPrototypeOf(obj)返回true,说明proto此刻就是原型对象 - 若一个对象从未被任何对象继承(比如
const a = {};),它仍是普通对象,但没在任何原型链中起作用
检查它是否是某个构造函数的 prototype 属性
常见原型对象往往来自构造函数的 prototype 属性。你可以比对:
-
obj === SomeConstructor.prototype—— 如果相等,基本可认定它是该类的原型对象 - 注意:
SomeConstructor.prototype本身也是普通对象,它自己也有原型(通常是Object.prototype)
排除“无原型”或“非典型”情况
有些对象不适合当原型,比如:
立即学习“Java免费学习笔记(深入)”;
-
Object.create(null)创建的对象:它的[[Prototype]]是null,不能作为有效原型(因为无法向上委托) - 原始值(
number、string等):不是对象,不能当原型 - 箭头函数、Symbol 等非对象值:同样不满足原型前提
不推荐依赖 __proto__ 或 constructor 判断
__proto__ 是非标准属性,且可被修改;constructor 可能被覆盖或丢失。应优先使用标准方法:
Object.getPrototypeOf(obj) === targettarget.isPrototypeOf(obj)-
obj instanceof Constructor(反向推断其原型是否为Constructor.prototype)


















