javascript对象属性查找会沿原型链向上回退,默认值可放原型以节省内存并统一管理;object.create可创建干净原型链;需用object.hasown区分自有属性;避免原型污染及共享引用。

JavaScript 对象属性查找时,如果自身没有该属性,会沿原型链向上查找。利用这个机制,可以自然地为对象提供默认值——把默认值放在原型上,实例只覆盖需要定制的属性。
默认值放原型,实例只写差异
把通用配置或默认行为定义在构造函数的 prototype 上,实例对象只需设置自己特有的值。访问时,若实例没有该属性,自动回退到原型上的默认值。
- 避免每个实例都重复创建相同属性,节省内存
- 修改原型上的默认值,所有未覆盖该属性的实例会立即生效(注意:谨慎用于生产环境)
- 适合配置项、方法、常量等不随实例变化的内容
用 Object.create 设置干净原型链
不依赖构造函数,直接用 Object.create 创建以默认配置为原型的对象:
const defaults = { timeout: 5000, retries: 3, format: 'json' };
const config = Object.create(defaults);
config.timeout = 8000; // 只覆盖需要改的
console.log(config.retries); // 3 ← 来自原型
这样创建的对象没有 constructor 或其他多余属性,原型链清晰,语义明确。
检查属性是否“自有”而非继承
有时需区分一个值是实例自己设置的,还是从原型继承来的。用 hasOwnProperty 或 Object.hasOwn(推荐,支持 ES2022+):
-
obj.hasOwnProperty('timeout')→ true 表示实例自己定义了 -
Object.hasOwn(obj, 'timeout')更安全,能正确处理 null/undefined 原型对象 - 注意:
in操作符和obj.prop !== undefined都会命中继承属性,不能判断来源
避免意外覆盖和原型污染
从原型链提取默认值很便利,但要注意边界:
- 不要给 Object.prototype 添加属性(如
Object.prototype.myDefault = ...),会导致全局污染和 for...in 遍历异常 - 慎用 __proto__ 直接修改原型,优先使用 Object.setPrototypeOf 或 Object.create
- 如果默认值是对象或数组,别直接在原型上共享引用——否则所有实例会共用同一份数据;应通过 getter 或工厂函数生成新副本
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











