JavaScript中的继承之类继承
继承简介
在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在JS中想要达到继承公用成员的目的,需要采取一系列措施。JS属于原型式继承,得益于这种灵活性,我们既可以使用标准的基于类的继承,也可以使用更微妙一些的原型式继承。在JS中应该要明确一点,一切继承都是通过prototype来进行的,且JS是基于对象来继承的。
继承:
functionAnimal(name){ this.name=name; this.showName=function(){ alert(this.name); } } functionCat(name){ Animal.call(this,name); } varcat=newCat("BlackCat"); cat.showName();
Animal.call(this)的意思就是使用Animal对象代替this对象,那么Cat中不就有Animal的所有属性和方法了吗,Cat对象就能够直接调用Animal的方法以及属性了.
多继承:
functionClass10() { this.showSub=function(a,b) { alert(a-b); } } functionClass11() { this.showAdd=function(a,b) { alert(a+b); } } functionClass2() { Class10.call(this); Class11.call(this); }
很简单,使用两个call就实现多重继承了
当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call的用法。说了call,当然还有apply,这两个方法基本上是一个意思,区别在于call的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments。
下面给大家介绍如何在JavaScript中实现简单的继承?
下面的例子将创建一个雇员类Employee,它从Person继承了原型prototype中的所有属性。
functionEmployee(name,sex,employeeID){ this.name=name; this.sex=sex; this.employeeID=employeeID; } //将Employee的原型指向Person的一个实例 //因为Person的实例可以调用Person原型中的方法,所以Employee的实例也可以调用Person原型中的所有属性。 Employee.prototype=newPerson(); Employee.prototype.getEmployeeID=function(){ returnthis.employeeID; }; varzhang=newEmployee("ZhangSan","man",""); console.log(zhang.getName());//"ZhangSan
上面关于继承的实现很粗糙,并且存在很多问题:
在创建Employee构造函数和原型(以后简称类)时,就对Person进行了实例化,这是不合适的。
Employee的构造函数没法调用父类Person的构造函数,导致在Employee构造函数中对name和sex属性的重复赋值。
Employee中的函数会覆盖Person中的同名函数,没有重载的机制(和上一条是一个类型的问题)。
创建JavaScript类的语法过于零散,不如C#/Java中的语法优雅。
实现中有constructor属性的指向错误。