关键要点
- JavaScript 对象是属性的集合,每个属性有名称和值,值可以是函数(称为方法)。
- 对象可以通过点表示法(如
obj.name)或括号表示法(如obj["name"])访问属性。 - 创建对象的方法包括对象初始化器、构造函数和
Object.create()。 - 对象支持继承,所有对象至少继承自一个原型。
- 对象是引用类型,两个不同对象通常不相等,除非引用同一个对象。
对象定义
JavaScript 对象是一个属性的集合,每个属性由一个名称(键)和一个值组成。值可以是任何数据类型,包括函数(此时称为方法)。对象可以是浏览器预定义的(如 Date、Array),也可以是自定义的(如 { name: "John" })。
属性访问
- 使用点表示法:
objectName.propertyName,如person.name。 - 使用括号表示法:
objectName["propertyName"],如person["name"],适合动态属性名。 - 属性名称区分大小写,可以是任何有效的 JavaScript 字符串,包括空字符串。
- 未赋值的属性返回
undefined,而不是null。
创建对象
有三种常见方法:
- 对象初始化器:直接用
{}创建,如var obj = { name: "John", age: 30 };,支持计算属性名。 - 构造函数:定义函数并用
new实例化,如function Person(name) { this.name = name; },然后new Person("John")。 - 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();。 - 访问器属性用
get和set定义,如get age() { return this._age; },或用Object.defineProperty,详见 getter、setter、Object.defineProperty。
属性操作
- 删除属性用
delete操作符,如delete obj.name,只删除自身属性,不影响继承的属性。
对象比较
对象是引用类型,两个不同对象通常不相等(fruit == fruitbear 返回 false),除非它们引用同一个对象(如 fruitbear = fruit,则 fruit == fruitbear 返回 true),详见 Equality operators。
调查笔记:JavaScript 对象的详细分析
JavaScript 对象是语言的核心数据类型之一,用于存储和操作复杂数据结构。其灵活性和强大功能使其成为开发中不可或缺的部分。以下是基于权威资料的详细分析,确保覆盖所有相关信息。
对象定义与特性
根据 MDN Web Docs,JavaScript 对象是一个属性的集合,每个属性由名称(键)和值组成。键通常是字符串或 Symbol,值可以是任何数据类型,包括函数(称为方法)。对象可以是预定义的(如 Date、Array)或自定义的(如 { name: "John" })。
- 引用类型:对象是引用类型,意味着变量存储的是对象的引用,而不是值本身。这导致两个变量可能指向同一个对象,修改一个会影响另一个。
- 动态性:对象是动态的,可以在运行时添加、修改或删除属性。
属性访问
属性可以通过两种方式访问:
- 点表示法:
objectName.propertyName,如person.name。要求属性名是有效的 JavaScript 标识符。 - 括号表示法:
objectName["propertyName"],如person["name"],适合动态属性名或包含特殊字符的属性名。 - 属性名称区分大小写,可以是任何字符串,包括空字符串。未赋值的属性返回
undefined,而不是null,详见 undefined 和 null。
创建对象的方法
有三种主要方式创建对象:
- 对象初始化器:
- 语法:
var obj = { property_1: value_1, ... }; - 支持 ES6 的计算属性名,如
{ [key + "Name"]: value }。 - 示例:
var person = { name: "John", age: 30 };
- 构造函数:
- 定义:
function Person(name, age) { this.name = name; this.age = age; } - 实例化:
var john = new Person("John", 30); - 构造函数通过
this绑定属性,new操作符创建新实例。
- 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 继承的核心机制:
- 对象的原型可以通过构造函数的
prototype属性访问,如Person.prototype。 - 示例:
Object.prototype是所有对象的最终原型,详见 Inheritance and the prototype chain 和 prototype property。
方法与访问器属性
- 方法:通过将函数赋值给属性定义,如
obj.sayHello = function() { console.log("Hello"); };,调用时如obj.sayHello();,详见 method definitions。 - 访问器属性:用
get和set定义,如: - 对象字面量:
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; } });,详见 getter、setter、Object.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";。 - 属性可以是数据属性(包含
value、writable、enumerable、configurable)或访问器属性(包含get、set)。 - 对象方法如
Object.assign()用于合并对象,Object.freeze()用于冻结对象,防止修改。
信息来源与可靠性
本文信息基于以下权威资料,确保准确性和全面性:
- MDN Web Docs: Working with objects 提供了官方文档,涵盖所有对象特性。
- 其他相关页面如 Object.keys、Object.create 等,确保信息的时效性和权威性。
这些资料一致性高,涵盖了 ES5 及以上版本的最新特性,确保信息的全面性和可靠性。
总结表
以下是 JavaScript 对象关键特性的总结表:
| 特性 | 描述 |
|---|---|
| 定义 | 属性集合,键值对,值可为函数(方法) |
| 属性访问 | 点表示法(如 obj.name)或括号表示法(如 obj["name"]) |
| 创建方式 | 初始化器、构造函数、Object.create() |
| 枚举方法 | for...in、Object.keys()、Object.getOwnPropertyNames() |
| 继承 | 原型链,所有对象至少继承自一个原型 |
| 方法 | 函数作为属性,调用如 obj.method() |
| 访问器属性 | 用 get/set 定义,如 get age() { return this._age; } |
| 删除属性 | 用 delete 删除自身属性 |
| 比较 | 引用类型,两个不同对象不相等,除非引用同一对象 |
关键引用
- Working with objects MDN Web Docs
- Object keys MDN Web Docs
- Object create MDN Web Docs
- Getter MDN Web Docs
- Setter MDN Web Docs
- Object defineProperty MDN Web Docs
- Inheritance and the prototype chain MDN Web Docs
- Undefined MDN Web Docs
- Null MDN Web Docs
- For in statement MDN Web Docs
- Object getOwnPropertyNames MDN Web Docs
- Prototype property MDN Web Docs
- Method definitions MDN Web Docs
- Equality operators MDN Web Docs