继承是面向对象的基本特征,其目的就是复用(无论是代码还是内存),其基本特征就是父类的方法与子类继承的方法为同一个方法
导航
原生的继承的方式-->模式下的继承方式-->瞎bb
原生的继承的方式
大神Brendan Eich设计脚本语言javascript时,认为他是一种简单的脚本语言,吸收了面向对象的方式,但没有引用类的概念(都类了,能简单吗),至于继承的概念,则通过万能的"分层"思想进行处理
1.如何创建对象
Java语言都使用new命令来生成实例。javascript吸收了new命令,以此从原型对象中创建新的实例,但Javascript没有"类",怎么来表示原型对象呢?大神很机智的发现,java使用new命令后跟的都是类的构造函数,因此javascript拥有构造函数却没有类的概念,而一个非常简单的设计方式就出来了
function Dog(name){ this.name= name; }
这是一个构造函数,对构造函数使用new就可以创建一个对象,而构造函数中的this则代表其自身,就这么简单
2.对象的继承
创建出来的实例对象自然应该是独立,且分开的,但对于公共部分,共享才是唯一的出路,经典的分层思想就在这里,只要将共享的部分提出来,所有的实例化对象在指向共享引用就可以了,此时大神加入了prototype属性
function Dog(name){ this.name= name; } Dog.prototype.species="犬科";
prototype指向的就是公共部分,Person中的this,表示的是实例中的对象,至此,javascript中的继承就已经完整的设计好了
模式下的继承方式
只要知道构造函数与prototype属性就已经掌握了javascript中的继承原理,不过这原理好像是创建原型以后,在创建父类的引用,缺少类概念的javascript又该如何让两个对象进行关联呢?
function Dog(name){ this.name= name; } function Animal(species){ this.species=species;//"动物种类" } Animal.prototype.getSpecies=function(){ return this.species; }
大神只设计了加减法,至于乘除就没有做太深的设计,需要开发人员进行简单的配合,当然我们的目的很明确,要让子类的prototype指向父类,如果可以的话需要一种不修改2个对象的方式
函数绑定
类似于super的方式
function Dog(name){ Animal.apply(this, "犬科"); this.name= name; }
1.修改了Dog的内部对象
prototype
强势修改
Dog.prototype = new Dog(); Dog.prototype.constructor =Dog;