对象字面量创建的对象原型默认指向Object.prototype,因其内部[[Prototype]]被JavaScript规定设为Object.prototype,从而继承toString等方法;例外是Object.create(null)返回null原型。

对象字面量创建的对象(如 {} 或 {a: 1})其原型默认指向 Object.prototype。
为什么是 Object.prototype?
JavaScript 规定:所有通过对象字面量语法创建的对象,内部 [[Prototype]](即 __proto__)自动被设为 Object.prototype。这表示它们是 Object 构造函数的实例,天然继承 toString、hasOwnProperty、valueOf 等通用方法。
-
const obj = {};→obj.__proto__ === Object.prototype为 true -
obj.toString()能正常调用,正是因为从Object.prototype继承而来 - 即使手动添加属性,如
obj.x = 1,也不改变其原型指向
例外情况:Object.create(null)
唯一常见例外是显式使用 Object.create(null) 创建的对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 它不继承任何东西,
__proto__直接为 null - 没有
toString、hasOwnProperty等方法,是真正的“空原型对象” - 常用于实现哈希表、避免原型污染等特殊场景
和构造函数创建的区别
对比 new Object() 或自定义构造函数:
立即学习“Java免费学习笔记(深入)”;
-
new Object()创建的对象,原型也是Object.prototype—— 和字面量行为一致 -
new Foo()创建的对象,原型是Foo.prototype,而非Object.prototype(除非Foo.prototype本身没被修改过,它默认就指向Object.prototype)
验证方式
可在控制台快速验证:
const a = {};
console.log(Object.getPrototypeOf(a) === Object.prototype); // true
console.log(a instanceof Object); // true
console.log(a.constructor === Object); // true(因为 constructor 从 Object.prototype 继承)

















