夺命雷公狗---javascript NO:33 类的继承(完结)
在有些面向对象编程语言中,可以通过extends关键词实现类的继承,这一点,在JavaScript中可以通过模拟的形式实现。
在JavaScript代码中可以通过以下三种形式实现类的继承:
1、通过扩展Object原型对象实现类的继承
基本语法:
Object.prototype.ext=function(parObject){
for(var i in parObject){
this[i]=parObject[i];
}
};
参数说明:
parObject :父类对象
子类对象.ext(父类对象);
示例代码:
<!DOCTYPE html> <html> <head> <meta charset=’utf-8′> <title></title> <script> //定义Object原型对象扩展程序 Object.prototype.ext = function(parObj){ for(var i in parObj){ this[i] = parObj[i]; } } //定义一个person的人类 function Person(p_name,p_age){ this.name = p_name; this.age = p_age; this.speak = function(){ alert(this.name+this.age); } } //定义一个student学生类 function Student(p_no){ this.no = p_no; this.say = function(){ alert(this.name+’–‘+this.age+’–‘+this.no); } } var stu = new Student(‘t009′); var per = new Person(‘lisi’,’55’); stu.ext(per); stu.speak(); </script> </head> <body> </body> </html>
通过Call与Apply方法实现类的继承
<!DOCTYPE html> <html> <head> <meta charset=’utf-8′> <title></title> <script> //定义一个person的人类 function Person(p_name,p_age){ this.name = p_name; this.age = p_age; this.speak = function(){ alert(this.name+this.age); } } //定义一个student学生类 function Student(p_no,p_name,p_age){ this.no = p_no; //使用call或者apply方法 Person.call(this,p_name,p_age); this.say = function(){ alert(this.name+’–‘+this.age+’–‘+this.no); } } //实现Student继承person类 var stu = new Student(‘t002′,’lisi’,’55’); stu.speak(); stu.say(); </script> </head> <body> <div id=’result’>call与apply方法主要功能是改变函数内部的this指向</div> </body> </html>
3、通过原型继承的方式实现类的继承
<!DOCTYPE html> <html> <head> <meta charset=’utf-8′> <title></title> <script> //定义一个person的人类 function Person(p_name,p_age){ this.name = p_name; this.age = p_age; this.speak = function(){ alert(this.name+this.age); } } //定义一个student学生类 function Student(p_no){ this.no = p_no; this.say = function(){ alert(this.name+’–‘+this.age+’–‘+this.no); } } //实现student继承person类 Student.prototype = new Person(‘lisi’,55); //通过以上代码可知student原型对象会自动继承person父类中的所有属性和方法 var stu = new Student(‘t009′); stu.speak(); </script> </head> <body> <div id=’result’>call与apply方法主要功能是改变函数内部的this指向</div> </body> </html>
总结:
1、第一种方法,通过扩展Object原型对象的ext属性实现类的继承,这种方法会有以下两个缺点:
1)由于Object类是所有类的基类,所以当我们定义ext属性时,所有类都会自动继承ext属性
2)当我们通过for…in…遍历父类属性时,其会增加子类对象的体积
2、第二种方法,使用Call与Apply方法,其虽然不会为所有类添加属性,但是其也会增加子类对象的体积。
3、第三种方法,使用原型继承的方法实现类的继承,因为是使子类原型对象自动继承父类构造器,相当于在子类构造器的原型对象添加父类属性和方法,由于继承关系,所以其并不会增大子类对象的体积,所以个人推荐第三种形式。