JavaScript中继承的方式主要有3种;javascript
第一种:原型链继承,经过将子元素的原型指向父元素的实例对象来实现继承 ;java
缺点:字面量重写原型会中断关系,使用引用类型的原型,而且子类型还没法给超类型传递参数函数
第二种:借用构造函数继承,经过继承父元素的构造函数,来继承其构造函数中声明的一些属性和方法;学习
缺点:借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。因此咱们须要原型链+借用构造函数的模式,这种模式称为组合继承测试
第三种:原型链+构造函数,在原型中处理方法,在构造函数中处理属性。this
优势:组合式继承是比较经常使用的一种继承方法,其背后的思路是 使用原型链实现对原型属性和方法的继承,而经过借用构造函数来实现对实例属性的继承。这样,既经过在原型上定义方法实现了函数复用,又保证每一个实例都有它本身的属性。prototype
备注:放在代码段里是为了方便测试和学习code
//(1)原型链 function Animal(name,age) { this.name = name; this.age = age; }; Animal.prototype.sayHello = function () { alert('hello'); }; function Dog(name,age) { //(2)借用构造函数 Animal.call(this,name,age); } Dog.prototype = new Animal(); Dog.prototype.run = function () { alert(this.name); } var dog = new Dog('huahua',2); console.log(dog); dog.sayHello(); dog.run(); //1)经过原型来实现继承时,原型实际上会变成另外一个类型的实例,原来的实例属性也就变成了如今的原型属性 // 2)在建立子类型的实例时,不能向超类型的构造函数传递参数。 //(3)伪经典继承 // 将原型链和借用构造函数的技术组合在一块儿。 // 原理是:使用原型链实现对原型属性和方法的继承,而经过借用构造函数实现对实例属性的继承。
继承关系图:对象