javascript对象如何工作_属性和方法怎样访问【教程】

JavaScript对象是动态键值集合,点号访问限于合法标识符,方括号支持任意字符串及表达式;隐式类型转换易致陷阱,方法调用需注意this绑定,属性可枚举性与可配置性影响遍历和删除。

JavaScript 对象不是“容器”,而是带属性和方法的动态键值集合;访问方式取决于属性名是否合法、是否被代理或冻结,也取决于你用的是点号还是方括号。

点号访问 . 和方括号访问 [] 的区别

点号只能访问符合标识符规则的属性名(即以字母/下划线/$开头,后续可含数字);方括号则支持任意字符串、变量甚至表达式。

  • obj.name 合法,obj.123obj.my-nameobj.user info 都会报语法错误
  • obj["123"]obj["my-name"]obj["user info"] 全部合法
  • 当属性名来自变量时,必须用方括号:const key = "age"; obj[key]
  • 点号访问更快且更易读,但缺乏灵活性;方括号略慢但通用性强

属性访问时的隐式类型转换陷阱

方括号中若传入非字符串值,JS 会自动调用 toString() 转成字符串——这常导致意外行为。

  • obj[1] 等价于 obj["1"],不是数组索引式访问
  • obj[null]obj["null"]obj[undefined]obj["undefined"]
  • obj[[1,2]]obj["1,2"](因为数组的 toString() 返回逗号拼接)
  • 避免依赖隐式转换:显式转字符串更安全,比如 obj[String(key)]

方法调用本质是函数调用,this 绑定取决于调用位置

对象上的方法只是普通函数,赋值给变量后调用,this 就会丢失指向。

  • obj.sayHi()this 指向 obj
  • const fn = obj.sayHi; fn()this 在非严格模式下是 window(浏览器),严格模式下是 undefined
  • 常见修复方式:fn.bind(obj)obj.sayHi.bind(obj)、箭头函数封装、或直接用 obj.sayHi.call(obj)
  • 类方法若用于事件监听器或回调,务必注意绑定,否则 this 很可能不是你预期的对象

对象属性的可枚举性、可配置性影响遍历和删除

Object.definePropertyclass 定义的属性默认不可枚举;for...inObject.keys() 都受此约束。

  • for...in 遍历所有**可枚举 + 自身或原型链上**的字符串键属性
  • Object.keys(obj) 只返回**自身 + 可枚举**的属性名数组
  • Object.getOwnPropertyNames(obj) 返回**自身所有**(包括不可枚举)属性名
  • delete obj.prop 是否成功,取决于该属性是否可配置(configurable: true
const obj = {};
Object.defineProperty(obj, 'hidden', {
  value: 42,
  enumerable: false,
  configurable: true
});
console.log(Object.keys(obj)); // []
console.log(Object.getOwnPropertyNames(obj)); // ["hidden"]
delete obj.hidden; // true(因为 configurable: true)

真正难的不是记语法,而是理解属性描述符(descriptor)如何控制访问行为,以及在 Proxy、Object.freeze、解构赋值等场景下这些控制如何被绕过或强化。