在JavaScript中,绝大多数对象都有原型,原型链是JavaScript实现继承的核心机制,但存在特殊情况的对象是没有原型的,比如通过Object.create(null)创建的对象,这类对象的原型为null,也就是我们所说的没有原型。要判断一个对象是否没有原型,本质是判断该对象的原型是否为null。

什么是没有原型的对象
JavaScript中每个对象都有一个内部属性[[Prototype]],指向它的原型对象。当访问对象的属性时,如果对象本身没有该属性,就会沿着原型链向上查找。正常情况下,通过字面量创建的对象、数组、函数等,原型最终都会指向Object.prototype,而Object.prototype的原型是null。
只有当对象的[[Prototype]]直接为null时,才属于没有原型的对象,这类对象不会继承任何Object原型上的方法,比如toString、hasOwnProperty等都无法直接调用。
判断对象是否没有原型的方法
方法一:使用Object.getPrototypeOf
Object.getPrototypeOf是ES5引入的标准方法,用于获取指定对象的原型,这是最推荐的判断方式,兼容性更好且符合规范。
// 创建一个没有原型的对象
const emptyProtoObj = Object.create(null);
// 创建一个普通对象
const normalObj = {};
// 判断函数
function isObjectWithoutProto(target) {
// 先判断target是否为对象,排除非对象类型
if (target === null || typeof target !== 'object') {
return false;
}
// 获取对象的原型,判断是否为null
return Object.getPrototypeOf(target) === null;
}
console.log(isObjectWithoutProto(emptyProtoObj)); // 输出 true
console.log(isObjectWithoutProto(normalObj)); // 输出 false
console.log(isObjectWithoutProto(null)); // 输出 false
console.log(isObjectWithoutProto(123)); // 输出 false
方法二:访问__proto__属性判断
__proto__是对象的内置属性,指向对象的原型,不过这是非标准属性,虽然大部分浏览器都支持,但不推荐在生产环境优先使用,仅作为了解即可。
const emptyProtoObj = Object.create(null);
const normalObj = {};
function isObjectWithoutProtoByProto(target) {
if (target === null || typeof target !== 'object') {
return false;
}
// 判断__proto__是否为null
return target.__proto__ === null;
}
console.log(isObjectWithoutProtoByProto(emptyProtoObj)); // 输出 true
console.log(isObjectWithoutProtoByProto(normalObj)); // 输出 false
注意事项
- 判断前一定要先校验入参是否为对象,避免非对象类型(比如null、数字、字符串)传入后出现判断错误,比如
typeof null会返回object,所以需要额外排除null的情况。 - 不要使用
obj.prototype来判断,prototype是函数才有的属性,普通对象没有这个属性,用普通对象访问会得到undefined,无法正确判断。 - 如果需要创建没有原型的对象,直接使用
Object.create(null)即可,不需要手动修改原型属性。
常见误区说明
有些开发者会误以为原型链终点是null就代表所有对象的原型都不是null,实际上只有特意创建的对象才会把原型设为null,普通对象的原型链终点是Object.prototype,其原型才是null,所以普通对象的原型不是null,不属于没有原型的对象。
判断对象没有原型的核心逻辑始终是校验对象的直接原型是否为null,选择标准方法Object.getPrototypeOf可以保证判断的准确性和兼容性。
JavaScript对象原型Object_getPrototypeOfnull原型对象原型判断修改时间:2026-07-10 12:54:42