高级程序设计读书笔记(六)---对象

2018-10-25  本文已影响0人  芗芗_

简介:
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构造函数和对象字面量都可以用来创建单个对象。但是这些方式有一个明显的缺点,使用同一个接口创建很多对象,会产生大量的重复代码

6.2.1 工厂模式
上一篇下一篇

猜你喜欢

热点阅读