继承
面向对象开发: 封装 继承 多态
面向对象开发: 封装 继承 多态
封装:
一、函数方式
二、闭包的方式
三、对象的方式 (面向对象)
1、工厂模式
2、构造函数模式
3、原型模式
4、混合模式(构造函数+原型)
多态:多态是指一个引用(类型)在不同情况下的多种状态。也可以理解成:多态是指通过指向父类的引用,来调用在不同子类中实现的方法
es5的继承的方式 推荐 es6 的 class
es5 类: 构造函数
es6 定义类: class
定义class , 生成实例化对象时依然通过new关键字调用, class的本质是函数
-
构造函数继承:
实现核心方式:需要在子类中通过 调用函数对象的call() 和 apply() 方法实现 Animal.call(this)优点:可以继承父构造函数中所有的属性和方法(私有的)
缺点:没有办法继承父构造函数原型对象上的属性和方法(共有的) -
原型对象继承 :
实现核心方式:子类的 prototype 属性 指向父类的实例化对象 Cat.prototype = new Animal()
优点:继承父构造函数原型对象上的属性和方法(共有的)
缺点:
修改了子类的原型对象的 constructor 指向 , 需要手动修改 Cat.prototype.constructor = Cat;
所有新实例都会共享父类实例的属性 , 一个实例对象修改了父类的方法和属性,则其他实例全部改变 -
构造函数 + 原型对象继承 *****************
-
拷贝继承 : 拷贝的是原型对象上的属性和方法
-
寄生式继承
-
组合寄生式继承
**实例对象的私有属性 也可以在类的最顶部定义
static 关键字 静态属性 不会被实例对象继承, 是类的属性, 需要通过 类本身来获取(访问)实例对象的属性也可以在constructor 中定义**
原型链
:原型本质的是 通过__proto__属性
直白的描述:
调用实例化对象的一个属性或者方法时,首先会在自身查找, 找到了则调用,如果找不到, 则会沿着实例化对象的__proto__属性去原型对象上查找,如果找到则使用,如果没有,则原型对象也有 __proto__属性,继续向上查找, 直到找到原型链的顶端 (null),有则用,没有报错; 最终通过 __proto__属性找到的所有的原型对象串起来形成了原型链
原型链概念:
每个实例化对象都具有一个原型链指针__proto__,该指针指向创建它的函数对象的原型对象,而上一层的原型对象的结构依然类似,有自己的原型链指针,指向创建它的函数对象的原型对象。这样利用__proto__一直指向Object的原型对象上,而Object的原型对象用Object.proto = null表示原型链的最顶端。这样由一系列__proto__串起来的原型对象就构成了原型链。