第六章 面向对象的程序设计

341 阅读3分钟

本文主要是根据《JavaScript高级程序设计》摘抄学习而成。
6.1 理解对象
两种属性:数据属性和访问器属性。特性:描述属性的各种特征,是为了实现JavaScript引擎用的,不能直接访问。

  • 数据属性,有4个特性:

  • [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。

  • [[Enumerable]]:表示能否通过 for-in 循环返回属性。

  • [[Writeable]]:表示能否修改属性的值。

  • [[Value]]:包含这个属性的数据值。

  • 访问器属性,有4个特性: [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为数据属性。

  • [[Enumerable]]:表示能否通过 for-in 循环返回属性。

  • [[Get]]:在读取属性时调用的函数。

  • [[Set]]:在写入属性时调用的函数。

定义及读取特性:Object.defineProperty()、Object.defineProperties()、Object.getOwnPropertyDescriptor()
6.2 创建对象

  • 工厂模式:虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题。
  • 构造函数模式(构造函数应该以大写字母开头)
    构造函数模式这种方法会经历4个步骤:
    1. 创建一个新对象
    2. 将构造函数的作用域赋给新对象(this指向这个新对象)
    3. 执行构造函数中的代码(为新对象添加属性或方法)
    4. 返回新对象
      构造函数的问题:每个方法都要在每个实例上重新创建一遍。
  • 原型模式:每个函数都有一个 prototype 属性,这个属性是一个指针,指向一个对象(函数的原型对象),这个对象包含可以由该类型的所有实例共享的属性和方法。
    • 理解原型对象:
    • 只要创建一个新函数,就会根据一组特定的规则为该函数创建一个 prototype 属性,指向原型对象
    • 默认所有原型对象都会获得一个 constructor 属性,指向 prototype 属性所在函数
    • 调用构造函数创建新实例后,实例将有一个 proto 属性,指向构造函数的原型对象,指针叫[[Prototype]],默认原型指向Object
    • 实例与构造函数没有直接关系
    • 读取属性:搜索先从对象实例本身开始,如果没找到,搜索原型对象
    • 使用 isPrototype() 来检测构造函数和实例之间是否有关系
    • 使用 hasOwnProperty() 来检测属性存在于实例中还是原型中

6.3 继承

  1. 最常用的继承:组合继承。融合了原型链和构造函数的优点。
  2. 原型式继承:可以在不必须先定义构造函数的情况下实现继承,其本质是执行对给定对象的浅复制。而复制得到的副本还可以得到进一步改造。
  3. 寄生式继承
  4. 寄生组合式继承