对象字面量创建的对象属性均为实例自身属性,优先级最高,访问时遵循“实例自身>原型链>Object.prototype>null”规则;显式设置__proto__仅指定原型,不改变属性覆盖逻辑。

对象字面量本身没有原型链上的“继承结构”,但它创建的对象会自动链接到 Object.prototype,因此属性访问依然遵循统一的查找优先级:实例自身 > 原型链(__proto__ 指向的原型)> Object.prototype > null。关键在于——对象字面量定义的属性,全部属于实例自身,天然拥有最高优先级。
对象字面量的属性全是实例属性
用 { a: 1, b: 2 } 创建的对象,所有键值对都直接挂在该对象上,等价于在构造后执行 obj.a = 1。它们不是定义在原型上,也不会被原型同名属性影响。
- 即使你后续给
Object.prototype.c = 'from proto',再访问{c: 'mine'}.c,结果仍是'mine' - 哪怕原型上有 getter 或 setter,只要实例自身有同名属性(哪怕是
undefined),就会被立即返回,不会触发原型上的逻辑 - 这种行为与
new Object()或构造函数中this.x = ...创建的属性完全一致,都是“自有属性”
手动设置 __proto__ 不改变覆盖规则
ES6 允许在字面量中用 __proto__ 显式指定原型,例如:
const obj = {
x: 10,
__proto__: { x: 20, y: 30 }
};
此时 obj.x 仍为 10,因为实例属性优先;obj.y 才会沿原型链找到 30。注意:__proto__ 是特殊属性,仅用于设置原型,它本身不参与属性查找——它只是让引擎知道“往哪找”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 不能用
__proto__覆盖已有实例属性:写{ x: 1, __proto__: { x: 2 } },x还是1 - 如果省略实例属性,比如
{ __proto__: { z: 99 } },那么z就只能从原型读取 - 不推荐在生产代码中显式使用
__proto__字面量,易混淆且性能略低;更推荐Object.create()
for...in 和 hasOwnProperty 的区别很关键
对象字面量创建的对象,其自有属性和原型属性在遍历时表现不同:
-
for...in会枚举所有可枚举的自有属性 + 原型链上可枚举的属性 -
Object.hasOwnProperty('key')只检测是否为当前对象“自己拥有”的属性,不查原型 - 例如:
const o = { a: 1 }; Object.prototype.b = 2; console.log('a' in o); // true;o.hasOwnProperty('a'); // true;o.hasOwnProperty('b'); // false
这意味着:判断一个属性是否来自字面量本身,必须用 hasOwnProperty 或 Object.prototype.hasOwnProperty.call(obj, key)。
嵌套对象不影响查找优先级
对象字面量支持嵌套,如 { user: { name: 'Alice' } },但嵌套结构不改变原型链行为——user 是实例属性,user.name 是另一个对象的实例属性,各自独立遵循“自身优先”原则。
-
obj.user = { name: 'Bob' }后,obj.user.name就不再受obj.user原来原型的影响 - 如果想让嵌套对象也共享方法,需单独为其设置原型,或用类/构造函数统一管理
- 深层属性访问(如
obj.a?.b?.c)中的每个点操作,都是一次独立的属性查找,每次也都走“实例 > 原型”流程

















