首页 > 语言 > JavaScript > 正文

全面分析JavaScript 继承

2024-05-06 15:38:42
字体:
来源:转载
供稿:网友

ES6之前,JavaScript并没有继承这一现有的机制。

ES5的继承方式

类式继承

//声明父类function Father(){this.fatherVal = 'father';}//为父类添加共有方法Father.prototype.getFatherValue = function(){return this.fatherVal;}//声明子类 function Child(){this.childVal = 'child';}//继承父类Child.prototype = new Father();//为子类添加共有方法Child.prototype.getChildValue = function(){return this.childVal;}

子类的prototype被赋予父类的实例,新创建的对象复制了父类的构造函数内的属性和方法并且将原型_proto_指向了父类的原型对象,这样就拥有了父类的原型对象上的属性和方法与父类构造函数中复制的属性和方法。

var instance = new Child();console.log(instance.getFatherValue()); //fatherconsole.log(instance.getChildValue()); //childconsole.log(instance instanceof Child); //trueconsole.log(instance instanceof Father); //trueconsole.log(instance instanceof Object); //trueconsole.log(Child instanceof Father); //falseconsole.log(Child.prototype instanceof Father); //true

缺点:

1.子类实例共用父类的公有引用属性。

2.无法对父类构造函数内的属性进行传参初始化。

function Father(){this.companies =['bigo','yy','uc']}funtion Child(){}Child.prototype = new Father();var instanceA = new Child();var instanceB = new Child();console.log(instanceB.companies); //['bigo','yy','uc']instanceA.companies.push('nemo');console.log(instanceB.companies); //['bigo','yy','uc','nemo']

构造函数继承

//声明父类function Father(val){this.companies =['bigo','yy','uc']this.val = val;}//声明父类原型方法Father.prototype.getCom = function(){console.log(this.companies);}//声明子类function Child(val){//继承Father.call(this,val);}var instanceA = new Child('childA');var instanceB = new Child('childB');instanceA.companies.push('nemo');console.log(instanceA.companies); //['bigo','yy','uc','nemo']console.log(instanceA.val); //childAconsole.log(instanceB.companies); //['bigo','yy','uc']console.log(instanceB.val); //childB

对Child调用call,将子类中的变量在父类中执行一遍,然后父类给this绑定,所以子类继承了父类的公有属性。

缺点:

由于这种类型的继承没有设计原型prototype,所以父类的原型方法不会被子类继承,而如果想被子类继承就必须放在构造函数中,这样创建出来的每个实例都会单独拥有一份而不能共用。

组合继承

//声明父类function Father(val){this.companies =['bigo','yy','uc']this.val = val;}//声明父类原型方法Father.prototype.getValue = function(){console.log(this.val);}//声明子类function Child(val,newVal){//构造函数式继承Father.call(this,val);this.newVal = newVal;}//类式继承Child.prototype = new Father();//声明子类原型方法Child.prototype.getNewValue = function(){console.log(this.newVal);}var instanceA = new Child("fatherA","childA");instanceA.companies.push('nemo');console.log(instanceA.companies); //['bigo','yy','uc','nemo']instanceA.getValue(); //fatherAinstanceA.getNewValue(); //childAvar instanceB = new Child("fatherB","childB");console.log(instanceA.companies); //['bigo','yy','uc']instanceB.getValue(); //fatherBinstanceB.getNewValue(); //childB            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选