JS继承

2019-01-05  本文已影响0人  Shaw007

继承

什么是继承,继承意味着子类能拥有超类的相关属性及方法,
其是面向对象编程中的一个概念。

维基关于Inheritance的解释如下:

In object-oriented programming, inheritance is the mechanism of basing an object or class upon another object (prototypical inheritance) or class (class-based inheritance), retaining similar implementation. In most class-based object-oriented languages, an object created through inheritance (a "child object") acquires all the properties and behaviors of the parent object (except: constructors, destructor, overloaded operators and friend functions of the base class)

在JS中原型链以及构建基于某一个原型对象的object可看作类似继承的写法,ES6中则加入了类似class extends等关键字作为语法糖来实现继承功能。

JS原生中是没有继承的概念的,但JS的一个很重要的特性就是原型链,这也是为什么不管是Array,Function等都有valueof等共有方法,因为这些对象的prototype.__proto__指向Object.prototype,即记录了object prototype对象的内存地址,访问Array,Function的方法或属性时,JS会首先在当前构造函数构建的对象查找,找不到,则通过记录的内存地址往上进行查找,类似面向对象中,通过继承可访问超类的属性和方法。

js继承.png

继承可实现属性和功能上的复用。

实现继承

接下来,我们实现下一个这样的需求,
关联Man对象与Human对象,使Man可拥有Human的所有属性和方法。

第一种方法,我们可能想到的是在Man中调用Human.call(this,args)实现在Man中拥有Human当前的属性和方法,但此时Man与Human的原型链并不一样,不是真正的继承,故简单的可修改Man.prototype.__proto__指向Human.prototype但这种方法有兼容问题,IE不识别, __proto__并非EMCAScript标准,解决方法如下:

通过new Fn方法,new Fn执行实际是先产生一个空对象,然后使调用new的对象即this执行这个空对象,然后使this.proto执行Fn.prototype,若有参数,则调用Fn.call(this,args),最后返回this.

new_proto_.png
根据此思路,可以构建一个空函数f,该空函数的prototype指向Human.prototype,然后Man.prototype由new f()构建
代码如下:
new_proto_fn.png

第二种方法是通过extends.
ES6中可有class及extends语法糖,
通过super进行超类的初始化


ES6——继承.png

两者方法相比较而言,第二种采用面向对象的写法,便于理解,但无法实现完全的修改,如在Man.prototype上添加一个非方法的属性,而第一种方法则可以完全进行控制

上一篇下一篇

猜你喜欢

热点阅读