面向对象day2

面向对象高级

面向对象的三大特性

  • 封装性:将复杂的实现过程包装、隐藏起来,给用户提供接口。
  • 继承性:在js中,继承是体现在对象与对象之间的关系,继承就是指一个对象有权去访问另一个对象上的成员。
  • 多态性:体现在子对象与父对象之间,在父对象身上的同一个行为,在各个子对象中的具体实现不同。

继承的方式

  • 基于原型
    • 扩展原型:在原有的原型上进行相应的扩展,实现继承。
    • 置换原型:将要被继承的对象,直接替换掉原有的原型,实现继承
  • 拷贝继承
    • 将指定对象上的所有成员拷贝一份,并添加到当前对象身上。
  • 对象冒充
    • 在一个构造函数中,可以动态的添加一个parent方法,指向已有的构造函数,然后调用parent方法去实例化当前对象的一部分成员(或全部成员)。此时这种方式被称为对象冒充。
    • 注意点:利用完parent属性后,记得删除该属性。
    • 在实际开发中,两种继承方式可以组合起来应用。

extend方法的实现:为了方便去实现拷贝继承

ES5 OBJect.create:通过置换原型的方式来实现继承。

  • Object.create(parent):返回值为一个新的对象,并且该对象继承自parent对象。
    var newObject = Object.create(parent);

原型链的概念

  • 几个默认
    • 所有对象都有proto 属性,这个属性引用它的原型对象。
    • 原型对象继承自Object.prototype,具有constructor属性;如果置换了原形,记得要添加constructor属性。
    • 只有函数具有prototype属性(除了Function.prototype)。
  • 概念:

    • 从当前对象到Object.prototype之间,存在一条层次分明,逐级递进的体现继承关系的链式结构,这个结构被称为原型链。

      属性搜索原则:当访问对象成员时,

  • 首先,在当前对象上查找,如果找到就直接返回(调用),停止查找。

  • 如果没有找到,就向其原型对象上查找,找到直接返回,停止查找。
  • 如果还没有找到,就继续向其原型对象的原型对象上查找,知道object.prototype;
  • 如果找到,就直接返回,并停止查找,否则返回undefined
  • 注意:
    • 如果访问对象的某个属性不存在的话,会搜索整个原型链,导致js性能降低。
    • 在实际开发中,尽量保持一个适合的原型链长度。
    • 兼顾js性能和代码的可读和可扩展性。

Object.prototype介绍

  • hasOwnProperty:判断当前对象的制定属性是不是自身的,而不是继承过来的,十本的就返回true,否则返回false。
  • isPrototypeOf:判断当前对象是否为指定对象的原型对象。是返回true,否则返回false
  • prototypeIsEnumerable:判断指定属性是否为自身的,并且可枚举的。都满足返回true,否则返回false。

构造函数的执行过程

  • 创建一个空对象obj
  • 将obj赋值给this(让this指向obj)
  • 将当前作用域交给this
  • 执行构造函数内部的代码
  • 将this返回。(return this)
文章目录
  1. 1. 面向对象高级
    1. 1.1. 面向对象的三大特性
    2. 1.2. 继承的方式
    3. 1.3. extend方法的实现:为了方便去实现拷贝继承
    4. 1.4. ES5 OBJect.create:通过置换原型的方式来实现继承。
    5. 1.5. 原型链的概念
    6. 1.6. 属性搜索原则:当访问对象成员时,
    7. 1.7. Object.prototype介绍
    8. 1.8. 构造函数的执行过程
|