52、JavaScript 面向对象的多态和继承

面向对象,继承、封装、多态。

面向对象是一个编程思想,支撑面向对象编程思想的语法是类(ES6之前没有这个概念)和对象。构造函数充当类的角色。构造函数和对象实现面向对象程序的时候,体现封装,继承,多态的特点。

封装:封构造函数

继承

继承:分类更加细分的构造函数

1.继承父一级的所有属性(改变父级构造函数的this指向)

 
Teddy无法直接继承Dog的原型对象,也就无法调用Dog的方法。因为本身不是通过new创建的Teddy,Teddy的也就无法直接共享到父一级上的方法。

2.继承父一级的原型对象(方法)

方法一:

对象拷贝:

地址拷贝:
 
值拷贝:
 
如果我们的原型继承使用了地址拷贝,那么如果父级修改了原型对象,子级也会跟着修改。要么就是子级修改了原型对象父级也会修改。这就影响到其他的子级使用父一级的原型。
 

原型链继承

如果使用值拷贝,那么子级和父级即使发生变化也不会相互影响。也称为原型链继承
 
方法二:ES6 Object.create() 原型链

原理:将子级的原型对象指向父级的原型对象,这个也是值拷贝。
 
方法三:子级.prototype=new 父级()

将子级的原型对象作为父级的实体,子级创建自己的属性是不会干扰到父级的。
 

多态:

使用原型链的继承之后,子级继承的构造函数方法进行更改只会在子一级生效,父级的构造函数方法还是一样的。
 
继承和多态同一件事情两种完全不同的侧重。

继承:侧重是从父一级构造函数,集成到的属性和方法(同样)

多态:侧重是子一级子级重写和新增的属性和方法。

(不一样)