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()从一个对象向两一个对象复制属性
所有不是原始值的都是对象。包括数组和函数。