在 JS 中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。接下来通过本文给大家介绍 JavaScript 中的继承之类继承,感兴趣的朋友一起看看吧
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
继承简介
在 JS 中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在 JS 中想要达到继承公用成员的目的,需要采取一系列措施。JS 属于原型式继承,得益于这种灵活性,我们既可以使用标准的基于类的继承,也可以使用更微妙一些的原型式继承。在 JS 中应该要明确一点,一切继承都是通过 prototype 来进行的,且 JS 是基于对象来继承的。
继承:
- function Animal(name){
- this.name = name;
- this.showName = function(){
- alert(this.name);
- }
- }
- function Cat(name){
- Animal.call(this, name);
- }
- var cat = new Cat("Black Cat");
- cat.showName();
Animal.call(this) 的意思就是使用 Animal 对象代替 this 对象,那么 Cat 中不就有 Animal 的所有属性和方法了吗,Cat 对象就能够直接调用 Animal 的方法以及属性了.
多继承:
- function Class10()
- {
- this.showSub = function(a,b)
- {
- alert(a-b);
- }
- }
- function Class11()
- {
- this.showAdd = function(a,b)
- {
- alert(a+b);
- }
- }
- function Class2()
- {
- Class10.call(this);
- Class11.call(this);
- }
很简单,使用两个 call 就实现多重继承了
当然,js 的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明 call 的用法。说了 call ,当然还有 apply,这两个方法基本上是一个意思,区别在于 call 的第二个参数可以是任意类型,而 apply 的第二个参数必须是数组,也可以是 arguments。
下面给大家介绍如何在 JavaScript 中实现简单的继承?
下面的例子将创建一个雇员类 Employee,它从 Person 继承了原型 prototype 中的所有属性。
- function Employee(name, sex, employeeID) {
- this.name = name;
- this.sex = sex;
- this.employeeID = employeeID;
- }
- // 将Employee的原型指向Person的一个实例
- // 因为Person的实例可以调用Person原型中的方法, 所以Employee的实例也可以调用Person原型中的所有属性。
- Employee.prototype = new Person();
- Employee.prototype.getEmployeeID = function() {
- return this.employeeID;
- };
- var zhang = new Employee("ZhangSan", "man", "");
- console.log(zhang.getName()); // "ZhangSan
上面关于继承的实现很粗糙,并且存在很多问题:
在创建 Employee 构造函数和原型(以后简称类)时,就对 Person 进行了实例化,这是不合适的。
Employee 的构造函数没法调用父类 Person 的构造函数,导致在 Employee 构造函数中对 name 和 sex 属性的重复赋值。
Employee 中的函数会覆盖 Person 中的同名函数,没有重载的机制(和上一条是一个类型的问题)。
创建 JavaScript 类的语法过于零散,不如 C#/Java 中的语法优雅。
实现中有 constructor 属性的指向错误。
来源: http://www.phperz.com/article/17/0222/266062.html