javascript属性查找机制分原始类型和对象两类:原始类型通过临时包装对象访问属性,无法添加自定义属性;对象则沿原型链逐级查找自有属性或继承属性,赋值操作只作用于自身导致遮蔽。

JavaScript 中的属性查找机制,对原始类型和对象是完全不同的两套逻辑。原始类型没有属性,所谓“点访问”是临时包装;而对象查找则严格依赖原型链,按规则逐级向上搜索。
原始类型看似有属性,其实是临时包装
原始类型(string、number、boolean、null、undefined、symbol、bigint)本身不是对象,不能挂载属性。但当你写 "hello".length 或 (42).toString() 时,JS 引擎会立即把该原始值包装成对应的包装对象(String、Number、Boolean),查完属性或调用方法后立刻销毁这个临时对象。
这意味着:
- 你无法给原始值添加自定义属性:let s = "abc"; s.foo = 123; console.log(s.foo) // undefined
- 每次访问都新建包装对象,不共享状态
- 这种自动装箱只发生在读取属性/调用方法时,赋值操作不会触发(所以赋值无效)
对象属性查找走的是真实原型链
对于普通对象、数组、函数等引用类型,属性查找遵循明确的四步规则:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 先查对象自身(自有属性),存在则直接返回
- 不存在,则顺着 __proto__ 去它的原型对象上找
- 原型上还没找到,继续跳转到原型的 __proto__(如 Array.prototype → Object.prototype)
- 直到抵达 Object.prototype.__proto__ === null,仍未找到就返回 undefined
这个过程不看构造函数名,也不依赖“类声明”,只认对象内部的 [[Prototype]] 链接关系。
区分“是否存在”和“是否自有”的两个关键工具
判断属性来源时,常用两个方法:
- 'prop' in obj:只要原型链上任一环节有该属性,就返回 true
- obj.hasOwnProperty('prop'):只检查对象自身,不沿原型链查找
例如:let arr = [1]; arr.hasOwnProperty('length') // false(length 在 Array.prototype 上),但 'length' in arr // true。
写入属性时不会走原型链,而是直接在当前对象上设置
这是容易忽略的关键点:读取属性会向上查找,但赋值不会。
- obj.name = 'Alice' 总是在 obj 自身上创建或更新 name,哪怕原型上已有同名属性
- 这导致“遮蔽(shadowing)”:自有属性会挡住原型上的同名属性
- 想改原型上的值,必须显式操作原型对象,比如 MyClass.prototype.count = 0










