js继承的几种方式
什么是继承?
继承:子承父业;一个原本没有某些方法或属性的对象,统一方法,拿到了另外一个对象的属性和方法。
1.构造函数继承(改变this指向继承)
function Parent(n){ this.name = n; this.skill = function(){ console.log(this.name + "是我的名字"); } } function Child(n){ Parent.bind(this,n)(); Parent.call(this,n); Parent.apply(this,arguments); } var c = new Child("帅哥"); console.log(c) c.skill();
bind,call,apply都可以 但是注意他们之间的格式。
2.原型对象继承
function Parent(n){ this.name = n; } Parent.prototype.skill = function(){ console.log(this.name + "是我的名字"); } function Child(n){} //注意对象的深浅拷贝 for(var i in Parent.prototype){ Child.prototype[i] = Parent.prototype[i]; } var c = new Child("帅哥"); console.log(c) c.skill();
3.原型链继承
function Parent(n){ this.name = n; } Parent.prototype.skill = function(){ console.log(this.name + "是我的名字"); } function Child(){} Child.prototype = new Parent("帅哥"); //改变子的原型对象上的skill方法 Child.prototype.skill = function(){ console.log(12312312) } var c = new Child(); console.log(c); c.skill();
//
c是实例(对象),有__proto__属性,指向Child.prototype,是Parent的实例(对象),有__proto__属性,指向Parent.prototype
4.混合继承
function Parent(n){ this.name = n; } Parent.prototype.skill = function(){ console.log(this.name + "是我的名字"); } function Child(n){ Parent.call(this,n) } for(var i in Parent.prototype){ Child.prototype[i] = Parent.prototype[i] } var c = new Child("帅哥"); console.log(c) c.skill();
通过将原型对象继承+构造函数继承混合的方法实现了既能继承构造函数又能继承原型,方便传参。
5.ES6继承(混合继承:构造函数+原型链)
class Parent{ constructor(n) { this.name = n } skill(){ console.log(this.name + "是我的名字") } } class Child extends Parent{ constructor(n){ super(n) } } var c = new Child("帅哥"); console.log(c) c.skill();
检测构造函数和实例之间的关系:
Parent的prototype的对象是否是 c 原型;
Parent.prototype.isPrototypeOf(c)
c是否是Child的实例;
c instanceof Child ;