JavaScript中无“原型属性”术语,需检测对象的[[Prototype]]指向或原型链属性访问;函数对象才有prototype属性,普通对象没有;准确检查用Object.getPrototypeOf(obj)===Constructor.prototype。

JavaScript 中没有“原型属性”这个标准术语,真正需要检测的是对象是否拥有某个特定的原型(即 [[Prototype]] 指向某构造函数或对象),或是否能通过原型链访问某个属性/方法。常见误用是把 obj.prototype 当作对象自身的属性来检测——但普通对象根本没有 prototype 属性,只有函数对象才有。
检查对象的原型是否为某构造函数
使用 Object.getPrototypeOf(obj) === Constructor.prototype 是最准确的方式。注意不能用 obj.__proto__(已废弃)或 obj.constructor === Constructor(易被篡改)。
-
推荐写法:
Object.getPrototypeOf(obj) === Array.prototype判断是否为原生数组实例 -
兼容旧环境:可回退到
obj.__proto__ === Array.prototype,但仅限调试或可控环境 -
避免陷阱:
obj.constructor可能被覆盖,instanceof在跨 iframe 场景下会失效
判断对象能否访问某个原型上的属性
本质是检测该属性是否存在于原型链中,而非对象自身。用 hasOwnProperty 只查自有属性,不满足需求;应使用 in 操作符或 Object.prototype.hasOwnProperty.call 配合 Object.getPrototypeOf 逐级遍历。
-
快速判断存在性:
'toString' in obj—— 返回true即说明原型链上有该属性 -
区分自有 or 继承:
obj.hasOwnProperty('toString')返回false,而'toString' in obj返回true -
定位定义位置:可循环调用
Object.getPrototypeOf直至null,检查每层是否hasOwnProperty
识别函数对象是否具备 prototype 属性
只有函数对象(包括箭头函数以外的 function、class、内置构造器)才拥有 prototype 属性;普通对象、数组、日期等实例均无此属性。
立即学习“Java免费学习笔记(深入)”;
-
安全检测方式:
typeof obj === 'function' && obj.hasOwnProperty('prototype') -
注意例外:箭头函数是函数,但不可构造,其
prototype为undefined,且不可枚举 -
实用判断:
obj.prototype !== undefined && obj.prototype !== null,再结合typeof obj === 'function'
验证对象是否为原型本身(即是否被用作 prototype)
有些场景需确认某对象是否正被其他对象作为原型使用(如 obj 是否等于 Object.getPrototypeOf(someObj))。这无法直接检测,但可通过间接方式推测:
-
查找引用者:遍历全局或作用域内已知对象,用
Object.getPrototypeOf(target) === obj检查 -
标记约定:在创建时手动添加标识,如
obj[Symbol.toStringTag] = 'MyPrototype',便于后续识别 -
限制用途:用
Object.freeze(obj)防止意外修改,暗示其设计意图是作为原型模板


















