6.1对象简介

对象是JavaScript的基本数据类型。对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值。对象也可看做是属性的无序集合,每个属性都是一个名/值对。属性名是字符串,因此我们可以把对象看成是从字符串到值的映射。这种基本数据结构还有很多种叫法,有些我们已然非常熟悉,比如“散列”(hash)、“散列表”(hashtable)、“字典”(dictionary)、“关联数组”(associative array)。然而对象不仅仅是字符串到值的映射,除了可以保持自有的属性,JavaScript对象还可以从一个称为原型的对象继承属性。对象的方法通常是继承的属性。这种“原型式继承”(prototypal inheritance)是JavaScript的核心特征。

JavaScript对象是动态的——可以新增属性也可以删除属性——但它们常用来模拟静态对象以及静态类型语言中的“结构体”(struct)。有时它们也用做字符串的集合(忽略名/值对中的值)。

除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象。

对象最常见的用法是创建(create)、设置(set)、查找(query)、删除(delete)、检测(test)和枚举(enumerate)它的属性。

每个属性有一些与之相关的“属性特征”(property attribute):·可写(writable attribute),·可枚举(enumerable attribute),·可配置(configurable attribute).

对象的三个相关的对象特性:对象的原型(prototype)·对象的类(class)·对象的扩展标记(extensible flag)。

对象的分类:·内置对象(native object)·宿主对象(host object)·自定义对象(user-defined object)。

属性分类:自有属性(own property)·继承属性(inherited property)

6.2创建对象

可以通过对象直接量、关键字new和 object.create( )来创建对象。

6.2.1 对象直接量

象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。

对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象。

6.2.2 通过new创建对象

new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数称做构造函数(constructor),构造函数用以初始化一个新创建的对象。JavaScript语言核心中的原始类型都包含内置构造函数。

6.2.3 原型

第三种对象创建技术之前,我们应当首先解释一下原型。每一个JavaScript对象(null除外)都和另一个对象相关联。“另一个”对象就是我们熟知的原型,每一个对象都从原型继承属性。

6.2.4 Object.create()

Object.create()是一个静态函数,而不是提供给某个对象调用的方法。示例:

6.3查询和设置属性

4.4节已经提到,可以通过点(.)或方括号([])运算符来获取属性的值。

6.3.1 作为关联数组的对象

object.property 和 object[“property”]. []的引用,可以在程序运行期间修改和创建。

6.3.2 继承

例子:

6.3.3 属性访问错误

属性访问表达式并不会返回或设置值。

6.4删除属性

delete运算符(见4.13.3节)可以删除对象的属性。它的操作数应当是一个属性访问表达式。delete运算符只能删除自有属性,不能删除继承属性。在严格模式中,delete后跟随一个非法的操作数(比如x),则会报一个语法错误,因此必须显式指定对象及其属性。

6.5测试/检测属性

测试队形属性是否有一个给定名字的属性。

可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成。

in运算符的左侧是属性名(字符串),右侧是对象。

对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到是自有属性且这个属性的可枚举性(enumerable attribute)为true时它才返回true。

6.6枚举属性

通常使用for/in循环遍历。

两个用以枚举属性名称的函数。第一个是Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成。
第二个枚举属性的函数是Object.getOwnPropertyNames(),它和Ojbect.keys()类似,只是它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性。

6.6.1 属性枚举顺序

6.7扩展对象

把一个对象的属性复制到另一个对象上,是一个常见的操作。可以代码实现,由于太常用增加了Object.assign()的功能。

6.8序列化对象

对象序列化(serialization)是指将对象的状态转换为字符串,也可将字符串还原为对象。函数JSON.stringify()和JSON.parse()是一对相反的操作。

JSON语法是JavaScript语法的子集。

6.9 对象方法

toString()方法,toLocaleString()方法,toJSON()方法,valueOf()方法

6.10 对象字面量扩展语法

6.10.1 简写属性

6.10.2 计算的属性名

6.10.3 符号作为属性名

6.10.4 扩展操作符

6.10.5简写方法

6.10.6 属性的获取方法与设置方法

6.11 小结

对象相关概念, 如可枚举和自有属性

对象字面量语法

读取,写入,删除,枚举和检查对象属性

继承, object.creat()方式继承。

object.assign()从一个对象向两一个对象复制属性

所有不是原始值的都是对象。包括数组和函数。