Js继承方式及优缺点

作为一门基于对象的语言,JS中也可以通过继承来实现父类型和子类型之间属性或方法的传递,其方式有以下几种:

1、原型链继承:子类型的原型对象是父类型的实例即subertype.prototype=new supertype();

缺点:子类型继承了父类型原型中的所有属性和方法,但是对于引用类型的属性值,所有实例共享,所以不能在不改变其他实例属性的情况下改变。

2、借用构造函数继承:在子类型的构造函数中使用call或者apply调用父类型的构造函数,即supertype.call(this)

new 操作符的原理是:1、创建一个新实例对象,该对象的__proto_指向subertype.prototype

                                   2、执行构造函数subertype中的代码,且这里的this为当前实例对象

                                   3、如果构造函数返回的是一个对象,那么就返回这个对象,如果不是,就返回第一步中创建的对象

缺点:由于new操作符的原理如上述所说,所以在执行构造函数subertype中就会执行supertype,但是子类型只能拥有父类型在构造函数中定义的属性或方法,并不能读取到父类型原型对象中的属性或方法。只能实现部分继承。

3、组合继承:将原型链继承和借用构造函数继承组合使用,使用原型链继承来继承共享的方法,使用借用构造函数继承来继承实例属性或方法。

缺点:父类型的构造函数会执行两次

4、原型式继承:就是弱化构造函数的概念,是基于一个已知对象来创建一个新的对象

function object(o){

function fn(){}

fn.prototype=o;

return new fn();

}

返回一个__proto_指向o的实例对象。ES5中规范为Object.create(o,{name:{

value:"greg"}};

缺点:仍然是属性值为引用类型时,所有实例共享该属性值。

5、寄生式继承:与寄生构造函数类似,创建一个仅用于封装继承过程的函数,在这个函数中来处理对象,最后返回这个对象

function inherit(o){

 var c=Object.create(o);

c.name="123";

c.sayName=function(){alert(this.name);};

return c;

}

缺点:寄生式继承对每个实例都创建一个sayName方法,无法达到函数复用的效果

6、组合寄生继承:使用寄生式继承来实现对原型属性和方法的继承,使用借用构造函数来实现对实例属性和方法的继承

其中注意:

subertype.prototype=Obeject.create(supertype.prototype);//这里使用寄生式继承,可以创建一个中间对象,将中间对象赋给subertype.prototype,这样再进行下面这句更改constructor的代码,就不会改变父类型的原型对象中的constructor,就可以区分实例是由subertype还是supertype创建的。

subertype.prototype.constructor=subertype;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值