zoukankan      html  css  js  c++  java
  • 夺命雷公狗---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、第三种方法,使用原型继承的方法实现类的继承,因为是使子类原型对象自动继承父类构造器,相当于在子类构造器的原型对象添加父类属性和方法,由于继承关系,所以其并不会增大子类对象的体积,所以个人推荐第三种形式。

  • 相关阅读:
    1061. 判断题(15)
    1031. 查验身份证(15)
    1006. 换个格式输出整数 (15)
    1046. 划拳(15)
    1001. 害死人不偿命的(3n+1)猜想 (15)
    1021. 个位数统计 (15)
    1054. 求平均值 (20)
    写出这个数 (20)
    设计模式之中介者模式
    kill命令
  • 原文地址:https://www.cnblogs.com/leigood/p/5032054.html
Copyright © 2011-2022 走看看