ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
#第6章 对象 - <a href="#no1">6.1 创建对象</a> - <a href="#no2">6.2 属性的查询和设置</a> - <a href="#no3">6.3 删除属性</a> - <a href="#no4">6.4 检测属性</a> - <a href="#no5">6.5 枚举属性</a> - <a href="#no6">6.6 属性`getter`和`setter`</a> - <a href="#no7">6.7 属性的特性</a> - <a href="#no8">6.8 对象的三个属性</a> - <a href="#no9">6.9 序列化对象</a> - <a href="#no10">6.10 对象方法</a> > 除了字符串、数字、`true`、`false`、`null`和`undefined`之外,JS中的值都是对象。 **对象最常见的用法是创建(`create`)、设置(`set`)、查找(`query`)、删除(`delete`)、检测(`test`)和枚举(`enumerate`)它的属性。** > 属性包括名字和值 > 1. 属性名可以包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。2. 值可以是任意JS值,或者可以是一个`getter`或`setter`函数。 - 内置对象(native object)是由ECMAScript规范定义的对象或类。例如:数组、函数、日期和正则表达式都是内置对象。 - 宿主对象(host object)是由JS解释器所嵌入的宿主环境定义的。客户端JS中表示网页结构的HTMLElement对象均是宿主对象。既然宿主环境定义的方法可以当成普通的JS函数对象,那么宿主对象也可以当成内置对象。 - 自定义对象(user-defined object)是由运行中的JS代码创建的对象。 - 自有属性(own property)是直接在对象中定义的属性。 - 继承属性(inherited property)是在对象的原型对象中定义的属性。 ##<a name="no1">6.1 创建对象</a> > 可以通过对象直接量、关键字`new`和`Object.create()`函数来创建对象。 ###6.1.1 对象直接量 > 对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,整改映射表用花括号括起来。 ###6.1.2 通过new创建对象 > `new`运算符创建并初始化一个新对象。关键字`new`后跟随一个函数调用。这里的函数称作构造函数,构造函数用以初始化一个新创建的对象。 ###6.1.3 原型 > 每一个JS对象(null除外)都从原型继承属性。 ###6.1.4 Object create() > 略 ##<a name="no2">6.2 属性的查询和设置</a> > 可以通过`.`或方括号`[]`运算符来获取属性的值。 ###6.2.1 作为关联数组的对象 > 略 ###6.2.2 继承 > 略 ###6.2.3 属性访问错误 > 略 ##<a name="no3">6.3 删除属性</a> > `delete`运算符可以删除对象的属性。**`delete`只能删除自有属性,不能删除继承属性。** ##<a name="no4">6.4 检测属性</a> > 可以通过`in`运算符、`hasOwnPreperty()`和`propertyIsEnumerable()`方法来检测属性。 - `in`运算符左侧是属性名(字符串),右侧是对象。如果对象的自由属性或继承属性中包含这个属性则返回`true`。 - 对象的`hasOwnPreperty()`方法用来检测给定的名字是否是对象的自有属性。对于继承属性将返回`false`。 - `propertyIsEnumerable()`只有检测到是自由属性且这个属性可枚举为`true`时它才返回`true`。 ##<a name="no5">6.5 枚举属性</a> > 略 ##<a name="no6">6.6 属性`getter`和`setter`</a> > 略 ##<a name="no7">6.7 属性的特性</a> > 数据属性的4个特性分别是它的值(`value`)、可写性(`writable`)、可枚举性(`enumerable`)和可配置性(`configurable`)。 ##<a name="no8">6.8 对象的三个属性</a> > 每个对象都有与之相关的原型(`prototype`)、类(`class`)和可扩展性(`extensible attribute`)。 ###6.8.1 原型属性 > 对象的原型属性是用来继承属性的。 ###6.8.2 类属性 > 对象的类属性是一个字符串,用以表示对象的类型信息。 ###6.8.3 可扩展性 > 对象的可扩展性用以表示是否可以给对象添加新属性。所有内置对象和自定义对象都是显示可扩展的,宿主对象的可扩展性是由JS引擎定义的。 ##<a name="no9">6.9 序列化对象</a> > 对象序列化是指将对象的状态转换为字符串,也可将空字符串还原为对象。 **ECMAScript5提供了内置函数`JSON.stringify()`和`JSON.parse()`用来序列化和还原JS对象。** ##<a name="no10">6.10 对象方法</a> ###6.10.1 toString()方法 > 它将放回一个表示调用这个方法的对象只的字符串。 ###6.10.2 toLocaleString()方法 > 这个方法返回一个表示这个对象的本地化字符串。 ###6.10.3 toJSON()方法 > 返回值是序列化的结果。 ###6.10.4 valueOf()方法 > `valueOf()`方法和`toString()`方法非常相似,但往往当JS需要将对象转换为某种原始值而非字符串的时候才会调用它,尤其是转换为数字的时候。具体到9.6.6章节讨论如果给自定义对象类型定义`valueOf()`方法。