本文主要是根据《JavaScript高级程序设计》摘抄学习而成。
6.1 理解对象
两种属性:数据属性和访问器属性。特性:描述属性的各类特征,是为了实现JavaScript引擎用的,不能直接访问。函数
-
数据属性,有4个特性:学习
-
[[Configurable]]:表示可否经过 delete 删除属性从而从新定义属性,可否修改属性的特性,可否把属性修改成访问器属性。this
-
[[Enumerable]]:表示可否经过 for-in 循环返回属性。prototype
-
[[Writeable]]:表示可否修改属性的值。设计
-
[[Value]]:包含这个属性的数据值。指针
-
访问器属性,有4个特性: [[Configurable]]:表示可否经过 delete 删除属性从而从新定义属性,可否修改属性的特性,可否把属性修改成数据属性。对象
-
[[Enumerable]]:表示可否经过 for-in 循环返回属性。继承
-
[[Get]]:在读取属性时调用的函数。ip
-
[[Set]]:在写入属性时调用的函数。原型链
定义及读取特性:Object.defineProperty()、Object.defineProperties()、Object.getOwnPropertyDescriptor()
6.2 建立对象
- 工厂模式:虽然解决了建立多个类似对象的问题,但却没有解决对象识别的问题。
- 构造函数模式(构造函数应该以大写字母开头)
构造函数模式这种方法会经历4个步骤:
- 建立一个新对象
- 将构造函数的做用域赋给新对象(this指向这个新对象)
- 执行构造函数中的代码(为新对象添加属性或方法)
- 返回新对象
构造函数的问题:每一个方法都要在每一个实例上从新建立一遍。
- 原型模式:每一个函数都有一个 prototype 属性,这个属性是一个指针,指向一个对象(函数的原型对象),这个对象包含能够由该类型的全部实例共享的属性和方法。
- 理解原型对象:
- 只要建立一个新函数,就会根据一组特定的规则为该函数建立一个 prototype 属性,指向原型对象
- 默认全部原型对象都会得到一个 constructor 属性,指向 prototype 属性所在函数
- 调用构造函数建立新实例后,实例将有一个 proto 属性,指向构造函数的原型对象,指针叫[[Prototype]],默认原型指向Object
- 实例与构造函数没有直接关系
- 读取属性:搜索先从对象实例自己开始,若是没找到,搜索原型对象
- 使用 isPrototype() 来检测构造函数和实例之间是否有关系
- 使用 hasOwnProperty() 来检测属性存在于实例中仍是原型中
6.3 继承
- 最经常使用的继承:组合继承。融合了原型链和构造函数的优势。
- 原型式继承:能够在没必要须先定义构造函数的状况下实现继承,其本质是执行对给定对象的浅复制。而复制获得的副本还能够获得进一步改造。
- 寄生式继承
- 寄生组合式继承