JavaScript 对象


关键要点

  • JavaScript 对象是属性的集合,每个属性有名称和值,值可以是函数(称为方法)。
  • 对象可以通过点表示法(如 obj.name)或括号表示法(如 obj["name"])访问属性。
  • 创建对象的方法包括对象初始化器、构造函数和 Object.create()
  • 对象支持继承,所有对象至少继承自一个原型。
  • 对象是引用类型,两个不同对象通常不相等,除非引用同一个对象。

对象定义

JavaScript 对象是一个属性的集合,每个属性由一个名称(键)和一个值组成。值可以是任何数据类型,包括函数(此时称为方法)。对象可以是浏览器预定义的(如 DateArray),也可以是自定义的(如 { name: "John" })。

属性访问

  • 使用点表示法:objectName.propertyName,如 person.name
  • 使用括号表示法:objectName["propertyName"],如 person["name"],适合动态属性名。
  • 属性名称区分大小写,可以是任何有效的 JavaScript 字符串,包括空字符串。
  • 未赋值的属性返回 undefined,而不是 null

创建对象

有三种常见方法:

  1. 对象初始化器:直接用 {} 创建,如 var obj = { name: "John", age: 30 };,支持计算属性名。
  2. 构造函数:定义函数并用 new 实例化,如 function Person(name) { this.name = name; },然后 new Person("John")
  3. Object.create():基于指定原型创建对象,如 var animal = Object.create(null);

枚举和继承

  • for...in 循环访问对象及其原型链上的可枚举属性。
  • Object.keys(o) 返回对象自身可枚举属性的名称数组。
  • Object.getOwnPropertyNames(o) 返回所有自身属性名称(包括不可枚举的)。
  • 所有对象至少继承自一个原型,可通过构造函数的 prototype 对象访问,详见 Inheritance and the prototype chain

方法和访问器

  • 方法是通过将函数赋值给属性定义的,如 obj.sayHello = function() { console.log("Hello"); };,调用时如 obj.sayHello();
  • 访问器属性用 getset 定义,如 get age() { return this._age; },或用 Object.defineProperty,详见 gettersetterObject.defineProperty

属性操作

  • 删除属性用 delete 操作符,如 delete obj.name,只删除自身属性,不影响继承的属性。

对象比较

对象是引用类型,两个不同对象通常不相等(fruit == fruitbear 返回 false),除非它们引用同一个对象(如 fruitbear = fruit,则 fruit == fruitbear 返回 true),详见 Equality operators


调查笔记:JavaScript 对象的详细分析

JavaScript 对象是语言的核心数据类型之一,用于存储和操作复杂数据结构。其灵活性和强大功能使其成为开发中不可或缺的部分。以下是基于权威资料的详细分析,确保覆盖所有相关信息。

对象定义与特性

根据 MDN Web Docs,JavaScript 对象是一个属性的集合,每个属性由名称(键)和值组成。键通常是字符串或 Symbol,值可以是任何数据类型,包括函数(称为方法)。对象可以是预定义的(如 DateArray)或自定义的(如 { name: "John" })。

  • 引用类型:对象是引用类型,意味着变量存储的是对象的引用,而不是值本身。这导致两个变量可能指向同一个对象,修改一个会影响另一个。
  • 动态性:对象是动态的,可以在运行时添加、修改或删除属性。

属性访问

属性可以通过两种方式访问:

  • 点表示法objectName.propertyName,如 person.name。要求属性名是有效的 JavaScript 标识符。
  • 括号表示法objectName["propertyName"],如 person["name"],适合动态属性名或包含特殊字符的属性名。
  • 属性名称区分大小写,可以是任何字符串,包括空字符串。未赋值的属性返回 undefined,而不是 null,详见 undefinednull

创建对象的方法

有三种主要方式创建对象:

  1. 对象初始化器
  • 语法:var obj = { property_1: value_1, ... };
  • 支持 ES6 的计算属性名,如 { [key + "Name"]: value }
  • 示例:var person = { name: "John", age: 30 };
  1. 构造函数
  • 定义:function Person(name, age) { this.name = name; this.age = age; }
  • 实例化:var john = new Person("John", 30);
  • 构造函数通过 this 绑定属性,new 操作符创建新实例。
  1. Object.create()
  • 创建具有指定原型的对象:var animal = Object.create(Animal.prototype);
  • 常用于实现原型继承,详见 Object.create

枚举对象属性

ECMAScript 5 引入了多种枚举方法:

  • for…in:遍历对象及其原型链上的可枚举属性,语法如 for (let prop in obj) { console.log(obj[prop]); },详见 for…in
  • Object.keys(o):返回对象自身可枚举属性的名称数组,如 Object.keys({a: 1, b: 2}) 返回 ["a", "b"],详见 Object.keys
  • Object.getOwnPropertyNames(o):返回对象自身所有属性名称(包括不可枚举的),如 Object.getOwnPropertyNames({a: 1}) 返回 ["a"],详见 Object.getOwnPropertyNames

继承与原型链

所有对象至少继承自一个原型,原型链是 JavaScript 继承的核心机制:

方法与访问器属性

  • 方法:通过将函数赋值给属性定义,如 obj.sayHello = function() { console.log("Hello"); };,调用时如 obj.sayHello();,详见 method definitions
  • 访问器属性:用 getset 定义,如:
  • 对象字面量:var obj = { get age() { return this._age; }, set age(value) { this._age = value; } };
  • 或用 Object.defineProperty,如 Object.defineProperty(obj, "age", { get: function() { return this._age; }, set: function(value) { this._age = value; } });,详见 gettersetterObject.defineProperty

属性操作

  • 删除属性:用 delete 操作符删除自身属性,如 delete obj.name,不会影响继承的属性,详见 delete operator

对象比较

对象是引用类型,比较时比较的是引用:

  • 两个不同对象永远不相等,如 var obj1 = {a: 1}; var obj2 = {a: 1}; obj1 == obj2 返回 false
  • 如果两个变量引用同一个对象,则相等,如 var obj1 = {a: 1}; var obj2 = obj1; obj1 == obj2 返回 true
  • 详见 Equality operators

其他特性

  • 对象支持动态添加属性,如 obj.newProp = "value";
  • 属性可以是数据属性(包含 valuewritableenumerableconfigurable)或访问器属性(包含 getset)。
  • 对象方法如 Object.assign() 用于合并对象,Object.freeze() 用于冻结对象,防止修改。

信息来源与可靠性

本文信息基于以下权威资料,确保准确性和全面性:

这些资料一致性高,涵盖了 ES5 及以上版本的最新特性,确保信息的全面性和可靠性。

总结表

以下是 JavaScript 对象关键特性的总结表:

特性描述
定义属性集合,键值对,值可为函数(方法)
属性访问点表示法(如 obj.name)或括号表示法(如 obj["name"]
创建方式初始化器、构造函数、Object.create()
枚举方法for...inObject.keys()Object.getOwnPropertyNames()
继承原型链,所有对象至少继承自一个原型
方法函数作为属性,调用如 obj.method()
访问器属性get/set 定义,如 get age() { return this._age; }
删除属性delete 删除自身属性
比较引用类型,两个不同对象不相等,除非引用同一对象

关键引用


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注