属性槽指对象自身独立的属性存储区,存放直接定义的键值对,不包含继承属性;object.keys等方法可枚举自身属性,原型链查找则动态委托而非拷贝,实现就近查找与行为复用。

JavaScript 中对象的“属性槽”并不是一个官方术语,但它常被用来形象化描述对象内部存储属性的方式——即对象自身拥有的可枚举或不可枚举的属性“位置”,类似一张键值对表格。理解它,有助于看清原型链中“属性查找”为何分层、为何有优先级。
属性槽就是对象自身的属性存储区
每个对象在创建时,都会分配一块独立的内存空间来存放它直接拥有的属性(比如 obj.name = 'Alice'),这部分就叫“自身属性槽”。这些属性不共享,修改不会影响其他对象。你可以把它想象成对象私有的小抽屉,只放自己明确声明的东西。
-
Object.keys(obj)只列出自身可枚举属性(即抽屉里标了标签、能被 for...in 看到的) -
Object.getOwnPropertyNames(obj)列出所有自身属性(包括不可枚举的,比如constructor) -
Object.hasOwn(obj, 'key')(ES2022+)准确判断某个 key 是否真在对象自己的槽里,而非从原型继承
原型链查找不进“别人的抽屉”,只沿链“借东西”
当你写 obj.toString(),JS 不会把 toString 复制到 obj 自身的属性槽里,而是按顺序检查:
- 先翻
obj自己的抽屉 → 没有 - 再看
obj.__proto__(即Object.prototype)的抽屉 → 有toString方法 - 直接使用,不复制、不迁移
这个过程是动态委托,不是静态拷贝。所以改 Object.prototype.toString,所有普通对象立刻受影响;但给 obj.toString = ...,只改它自己的槽,屏蔽了原型上的同名方法(即“属性遮蔽”)。
构造函数与实例的属性槽分工很清晰
function Cat(name) {
this.name = name; // ✅ 写入实例自身的属性槽
}
Cat.prototype.meow = function() { return 'meow'; }; // ✅ 写入原型对象的属性槽
const c1 = new Cat('Miao');
const c2 = new Cat('Hua');
console.log(c1.name); // 'Miao' —— 各自槽里独立存
console.log(c1.meow()); // 'meow' —— 共用 Cat.prototype 的槽
注意:属性槽不包含继承来的属性,只管“自己写的”
哪怕 c1 能访问 c1.constructor,这个 constructor 实际存在 Cat.prototype 里,不在 c1 自身槽中。c1.hasOwnProperty('constructor') 返回 false 就说明这点。
本质上,属性槽 + 原型链 = 一种轻量级的“就近查找 + 委托复用”机制。它让每个对象保持精简,又通过隐式链接共享行为,是 JavaScript 实现继承和节省内存的关键设计。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











