高级程序设计读书笔记(六)---对象
简介:
ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值,对象或者函数”,每一个对象都是基于一个引用类型创建的 (俗称:ECMAScript一切皆对象)
6.1 理解对象
创建对象一般有两种方式:
// 1 原生构造函数Object
let person = new Object()
// 2 对象字面量
let person = {}
6.1.1 属性类型
ECMAScript定义:描述属性的各种特征 这些特性是为了实现javascript引擎用的,因此在javascript不能直接的访问他们
ECMAScript中有两种属性:数据属性和访问器属性
1.数据属性
[[Configurable]]:表示是否能通过delete杉树属性而从新定义属性,是否能修改属性的特性,是否能把属性修改为访问器属性,直接在对象上定义的属性 ,这个特性默认为true
[[Enumerable]]:表示能付通过for-in 循环返回属性,直接在对象上定义的属性 ,这个特性默认为true
[[Writable]]: 表示能否修改属性的值,直接在对象上定义的属性 ,这个特性默认为true
[[Value]]: 包含这个属性的值,读取的时候从这个位置读取,写入的时候把新值保存在此位置,这个特性默认为undefined
2.访问器属性
访问器属性不包含数据值,包含一对getter和setter函数,访问器属性不能直接定义,必须使用Object.defineProperty()来定义
[[Configurable]]:表示是否能通过delete杉树属性而从新定义属性,是否能修改属性的特性,是否能把属性修改为访问器属性,直接在对象上定义的属性 ,这个特性默认为true
[[Enumerable]]:表示能付通过for-in 循环返回属性,直接在对象上定义的属性 ,这个特性默认为true
[[Get]]: 读取属性时调用的函数,性默认为undefined
[[Set]]: 写入属性时调用的函数,性默认为undefined
⚠️注意:不一定非要同事制定get和set函数,只制定get意味着属性是只读属性不能写入
// 直接定义在对象上的属性默认特性都为true
var person = {name:'xiangxiang'}
Object.getOwnPropertyDescriptor(person,'name')
// {value: "xiangxiang", writable: true, enumerable: true, configurable: true}
// 当直接用defineProperty去定义一个属性的时候不指定其他值 属性默认特性都为false
Object.defineProperty(person,'age',{value:18})
Object.getOwnPropertyDescriptor(person,'age')
// {value: 18, writable: false, enumerable: false, configurable: false}
// 修改age
person.age = 19
// person {name: 'xiangxiang', age: 18}
// 默认特性writable fals
6.1.2 定义多个属性
Object.defineProperties(obj,{
a:{value:1},
b:{value:2},
})
6.1.3 读取属性的特性
Object.getOwnPropertyDescriptor(obj,'a') 获取a这个属性的描述符
6.2 创建对象
虽然Object构造函数和对象字面量都可以用来创建单个对象。但是这些方式有一个明显的缺点,使用同一个接口创建很多对象,会产生大量的重复代码