1、原型继承:父类的值写在里面,子类值也写在里面,然后子类需要New一个实例化父类让子类继承,接着需要让子类.
prototype
.
constructor=
子类
(被覆盖的构造器重新)指向自己。如果子
原型添加属性,直接会影响到父对象,但是需要New一个父对象,再打印。
2、原型链继承:对原型继承的改进,由于Person对象中,不变的属性可以写入Person.prototype,需要放在父函数外面写这些固定值。所以,可以让子函数Man.prototype=Person.prototype,接着需要让子类.
prototype
.
constructor=
子类
(被覆盖的构造器重新)指向自己。如果子
原型添加属性,直接会影响到父对象,但是需要New一个父对象,再打印。
3、空函数作为中介继承:
空函数的原型
prototype=父的原型
prototype
子原型=new 空函数实例化对象覆盖子原型()
接着需要让子类.
prototype
.
constructor=
子类
(被覆盖的构造器重新)指向自己。
修改子类
的
prototype
对象,不会影响到父
的
prototype
对象
4、绑定继承:call applay bind
5、组合继承:
将原型链继承和构造函数继承组合在一块
也就是说父函数既有构造函数本身的值,写在父函数的里面,也有父原型的值写在外面,如果原型继承和构造继承都要实现继承的话,不仅需要在子函数里call过来父构造函数里面的值,父
原型的值也利用子原型=New 父(
)
Man
.
prototype
=
new
Person
();,然后var一个实例化子对象看是否继承
var
man1
=
new
Man
();
6、拷贝继承:
前面都一样(父是空函数。利用复原型在父函数外面直接赋值给父函数),子类也是构造空函数
,然后封装函数的方法,在里面先整两个父和子的变量重新接受一下形参的父和子原型
接着再for in 循环一个他的值,接着调用一下这个封装函数并传入实际参数,再利用父的方法让子调用
7、ES6中的class继承:利用构造器来传参,或者设置自身的属性和方法
// 父类
class Person {
// 利用构造器来传参,或者设置自身的属性和方法
constructor() {
this.name = "zhangs"
}
show() {
document.write("姓名:" + this.name)
}
}
// 子类 通过关键字extends继承父类
class Man extends Person {
// 子类构造器
constructor(name) {
// 利用super调用父类的构造函数
super(name)
}
}
var man1 = new Man("王五")
man1.show()