继承是指一个对象直接使用另一对象的属性和方法。
Javascript 在ES6
之前并没有像其他面向对象编程语言(如:C++、Java)有“类”(class)的概念,虽然设计了构造函数,但只能创建对象的副本,无法共享属性和方法。所以在ES6
之前,js 对象的继承主要还是通过prototype
属性实现。
下面展示几种原始的继承方法:
构造函数的继承
要使用到的构造函数
1 | function Animal() { |
构造函数绑定
使用 call 或 apply 方法,将父对象的构造函数绑定到子对象上
1 | function Cat(name, color) { |
prototype 模式
如果”猫”的 prototype 对象,指向一个 Animal 的实例,那么所有”猫”的实例,就能继承 Animal 了
1 | Cat.prototype = new Animal() |
注意:改变了对象的 prototype ,需要手动将 新 prototype 对象的 constructor 属性指向原来的构造函数。
1 | o.prototype = {} |
直接继承 prototype
将 Cat 的 prototype 对象,然后指向 Animal 的 prototype 对象
缺点:Cat.prototype 和 Animal.prototype 现在指向了同一个对象
Animal.prototype.constructor === Cat
1 | function Animal() {} |
利用空对象作为中介
1 | var F = function() {} |
封装:
uber 属性 指向父对象的 prototype 属性,可以直接调用父对象的方法
1 | function extend(Child, Parent) { |
拷贝继承
1 | function Animal(){ } |
非构造函数继承
object() 方法
1 | function object(o) { |
浅拷贝
1 | function extendCopy(p) { |
深拷贝
1 | function deepCopy(p, c) { |
ES6 Class
类的所有方法实际上都定义在类的 prototype 属性上面。
1 | class Animal { |