
JavaScript 中的对象类型
什么是对象
简单的说,对象就是一组属性(property)的集合。每个属性包含两部分:
属性名(key)—— 可以是字符串或者符号(symbol)类型值。
特征(attributes)—— 用来描述属性的状态。
属性的分类
对象属性可以分为两类:
- 数据属性(data property)—— 属性值是可以直接访问的。
- 访问器属性(accessor property)—— 属性值通过访问器函数(accessor function)来访问的,包含 getter 和 setter 方法。getter 方法用来获取属性值,setter 方法用来设置属性值。换句话说,访问器属性不单独保存属性值,属性值都是通过访问器函数来获取和设置的。
一个属性要么是访问器属性(具有 getter/setter 方法),要么是数据属性(具有 value),但不能两者都是。
示例:
属性的特征
数据属性中的特征:
访问器属性中的特征:
用来描述属性的特征(attribute)是存放在属性描述对象(attributes object)中的,这些特征又被称为属性描述符。
通过 Object.getOwnPropertyDescriptor() 方法可以获取对象属性的属性描述对象。
对象的创建
对象的创建有三种方式:
- 使用初始化器 —— 对象字面量。
- 使用构造函数 —— 使用 new 关键字让构造函数返回一个对象实例。
- 使用 Object.create() 方法 —— 以现有对象为原型,返回一个新的对象。
初始化器
一个对象初始化器,由大括号 ({}) 和其包含的零个或多个键值对构成。
示例一: ES6 之前的语法
**示例二:**ES6 新增的语法
构造函数
在早期,JavaScript 语言使用构造函数(constructor)作为创建对象的模板。构造函数与普通函数的区别是:函数体内部使用了 this 关键字表示所要生成的对象实例,生成对象时必须使用 new 关键字。
这种写法跟传统的面向对象语言(例如 C++ 和 Java)差异很大,让学过 Java 等语言的人感到困惑和费解。后来,ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到。
Object.create() 方法
以现有的对象作为原型,生成新的实例对象。新生成的对象会继承原型对象的属性。
Object.create() 方法生成的对象,会继承它的原型对象的构造函数。
属性的操作
属性的查看
使用 Object.keys 方法查看一个对象本身的所有属性。
属性的读取
读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。
方括号运算符中可以使用变量和表达式。
属性的新增和修改
与属性的读取一样,可以使用点运算符或者方括号运算符,来新增或者修改属性。若指定的属性存在,则修改该属性的值;若不存在,则新增该属性。
这种方法只能设置属性的值,属性的其他特征都是默认值。
若要对对象属性进行更精细的设置,则可以使用 Object.defineProperty() 方法来新增或修改属性。它的用法如下:
Object.defineProperty 方法接受三个参数:
- object:属性所在的对象
- propertyName:字符串,表示属性名
- attributesObject:属性描述对象
若属性不存在,则新增该属性;若属性存在,则更新该属性。该方法的返回值是修改后的对象。
属性的删除
delete 命令用于删除对象的属性,删除成功后返回 true。
作者:lingyundu
