对象字面量属性默认可枚举、可配置、可写,object.create()默认全为false且支持显式描述符控制;前者属性在实例上,后者依赖原型链,object.create(null)无原型。

对象字面量和 Object.create() 在属性定义上最核心的区别在于:**属性的可枚举性、可配置性和可写性默认值不同,且后者支持精细控制属性描述符,前者一律默认开启**。
属性默认特性不同
用字面量创建的对象,所有属性默认是:可枚举(enumerable)、可配置(configurable)、可写(writable)。比如:
const obj = { name: 'Alice', age: 30 };
这里的 name 和 age 属性,其描述符中 enumerable、configurable、writable 全为 true,可通过 for...in 遍历,也能被 delete 删除,还能重新赋值。
Object.create 支持显式描述符配置
Object.create(proto, propertiesObject) 的第二个参数允许你逐个定义属性,并明确指定每个特性的布尔值。未显式声明时,默认值是 全为 false(注意:这是关键差异)。
例如:
const obj = Object.create(null, {<br> name: { value: 'Alice' },<br> age: { value: 30, writable: true, enumerable: true }<br>});
这里:
• name 只设了 value,其余三项默认 false → 不可枚举、不可删、不可改
• age 显式开启了 writable 和 enumerable,但 configurable 仍为 false
原型链上的属性 vs 实例自身属性
字面量创建的对象,所有属性都直接挂在实例上,__proto__ 指向 Object.prototype。Object.create(proto) 创建的对象,其自身属性仅来自第二个参数(如有),其余行为完全继承自 proto 对象 —— 这意味着属性查找会走原型链,而字面量对象几乎不依赖原型链来存业务属性。
特别地:
• Object.create(null) 创建的对象没有原型,连 toString、hasOwnProperty 都不存在
• 字面量对象总有 Object.prototype 上的方法,哪怕没显式定义
实际影响场景
这些区别在以下情况会显现出来:
• 用 for...in 遍历时,Object.create 中未设 enumerable: true 的属性不会出现
• 调用 delete obj.key 时,configurable: false 的属性删不掉
• 使用 Object.keys() 或 JSON.stringify() 时,只处理可枚举属性,Object.create 默认定义的属性会被忽略
• 做 Map-like 数据结构(如高频查表)时,Object.create(null) 避免原型干扰,更安全高效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











