您的位置:首页 > Web前端 > JavaScript

夺命雷公狗---javascript NO:33 类的继承(完结)

2015-12-09 10:28 721 查看
在有些面向对象编程语言中,可以通过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、第三种方法,使用原型继承的方法实现类的继承,因为是使子类原型对象自动继承父类构造器,相当于在子类构造器的原型对象添加父类属性和方法,由于继承关系,所以其并不会增大子类对象的体积,所以个人推荐第三种形式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: