javascript对象如何创建_属性和方法怎样访问

12次阅读

对象字面量{}最安全,避免new遗漏和原型污染;属性名含空格需引号;方法是函数值,支持简写;计算属性用[key];点号访问合法标识符,方括号支持动态键;this绑定取决于调用方式;Object.defineProperty默认不可枚举。

javascript对象如何创建_属性和方法怎样访问

对象字面量是最常用也最安全的创建方式

直接用 {} 创建对象,适合一次性定义结构明确的数据。它天然避免了构造函数调用时忘记 new 的问题,也不涉及原型链污染风险。

常见错误是误把逗号写在最后一项后面(虽然现代引擎大多容忍,但 IE8 及更早版本会报 Unexpected Token });还有人试图在字面量里写方法体带 return 语句却忘了加函数关键字。

  • 属性名含空格或特殊字符必须用引号包裹:{"user name": "Alice"}
  • 方法就是值为函数的属性:sayHi: function() { return "Hi"; } 或简写为 sayHi() { return "Hi"; }
  • 计算属性名用方括号:[keyName]: "value",其中 keyName 是变量

点号和方括号访问属性,适用场景完全不同

. 只能访问合法标识符命名的属性,写法简洁;[] 支持动态键名、数字索引、保留字甚至表达式,但性能略低且易因类型转换出错(比如 obj[1] 实际查的是 "1" 这个字符串键)。

典型翻车现场:把 obj.user.name 写成 obj["user.name"] —— 后者查的是名为 "user.name" 的单一属性,不是嵌套路径。

立即学习Java免费学习笔记(深入)”;

  • 点号访问:obj.nameobj.sayHi()
  • 方括号访问:obj["first name"]obj[variableKey]obj[123]
  • 访问不存在属性返回 undefined,不会报错;但对 undefined 调用方法会抛 TypeError

方法内部的 this 指向取决于调用方式,不是定义位置

这是最容易被忽略的复杂点。同一个函数赋给不同对象,this 就不同;从对象上取出来单独调用,this 会丢失(非严格模式下指向全局,严格模式下为 undefined)。

例如:

const obj = {   name: "Bob",   greet() { console.log("Hello, " + this.name); } }; const fn = obj.greet; fn(); // 输出 "Hello, undefined"(严格模式)或报错

  • 保持 this 绑定可用 bind、箭头函数(但箭头函数不能作为构造函数)、或调用时用 call/apply
  • 类方法默认不自动绑定,react 类组件中常需在 constructor 里手动 bind 或改用箭头函数
  • 对象方法内访问自身其他属性,必须显式通过 this.xxx,不能省略 this

Object.defineProperty 和可枚举性影响 for...injsON.stringify

Object.defineProperty 添加的属性默认不可枚举(enumerable: false),这意味着它不会出现在 for...in 循环里,也不会被 json.stringify 序列化——这点常被忽略,导致调试时“看不见”某些属性。

例如:

const obj = {}; Object.defineProperty(obj, "secret", {   value: "hidden",   enumerable: false }); console.log(JSON.stringify(obj)); // "{}"

  • 想让属性参与遍历和序列化,必须显式设 enumerable: true
  • Object.keys() 只返回可枚举自有属性,Object.getOwnPropertyNames() 才包含不可枚举的
  • 现代开发中更推荐用 class 或私有字段 #field 控制可见性,而非依赖 enumerable

属性名是否合法、访问方式是否匹配、this 是否按预期绑定、以及属性是否可枚举——这四点覆盖了 90% 的实际坑。写的时候多看一眼控制台输出的完整对象结构,比背规则管用。

text=ZqhQzanResources