关键要点
- 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