浅谈 js 继承实现

为什么需要js继承

主要是为了减少代码的冗余量。下面用例子来说明。

假设我们需要2个类,一个小学生(Purpil), 一个中学生(MidStudent), 他们各自的属性和方法如下

       //小学生
       function Purpil(name, age) {
           this.name = name;
           this.age = age;

           this.show = function() {
              window.alert(this.name + " " + this.age);
           }
           this.cost  = function(money) {
              window.alert("应缴费用:" +  money * 0.6);
           }
      } 

       //中学生
       function MidStudent(name, age) {
           this.name = name;
           this.age = age;
           this.show = function() {
              window.alert(this.name + " " + this.age);
           }
           this.cost  = function(money) {
              window.alert("应缴费用:" +  money * 0.9);
           }
      }     

对比上面的代码可以看出,只有cost方法中的应缴汇率,二者是不同的,而属性(姓名,年龄)及show方法,则是完全相同的,这就造成了代码的冗余,为了解决这个问题,我们需要引入继承。

接下啦我们一起看看继承的几种方式

js继承方式

1.对象冒充

          //首先我们新建一个具有学生共同属性和方法的类 Student
          //将中学生和小学生共通的属性及方法提炼出来
         function Student(name,age) {
              this.name = name;
              this.age = age;
              this.show = function() {
                 window.alert(this.name + " " + this.age);
              }
         }
          // 对象冒充
          function Purpil(name,age) {
             // 声明一个变量,让其指向具有共同属性和方法的类(Student)
             this.stu = Student;
             // 执行Student类的构造方法,这句话必须要执行,原因是js是动态编译语言
             // 只有执行了这个方法才会声明属性、方法,否则的话执行时会报错
             this.stu(name,age);
          }
          var purpil = new Purpil('小明',30);
          purpil.show(); 

2.通过原型对象链的方法

这种方法是在最近所做项目(对日项目,而且系统比较老)的代码中出现比较多。

         // 学生类的定义和上述1是相同的
           function Student(name,age) {
              this.name = name;
              this.age = age;
              this.show = function() {
                 window.alert(this.name + " " + this.age);
              }
           } 
          // 原型链
          function Purpil(name,age) {
            // 将参数传递给父类
          	this.__proto__.name = name;
          	this.__proto__.age = age;
             // 小学生特有的方法
             this.cost  = function(money) {
                 window.alert("应缴费用:" +  money * 0.6);
             }
           }
           // 这是原型链方法实现的核心,将他的原型对象(可以理解成父类)指向Student
           // Purpil.prototype中定义的属性和方法可以被Purpil的每个实例所引用
           Purpil.prototype = new Student();
           var purpil = new Purpil('小明',30);
           purpil.show();
           purpil.cost(2000);

3.call方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值