【笔记】你不知道的JavaScript上卷——混合对象“类”

JavaScript中有一些方法近似实现类的功能,他并没有类

混入

  1. 显示混入 使用call绑定this

    • 混合复制

      function mixin(sobj,tobj) {
        for(var key in sobj) {
          if(!(key in tobj)) { //什么都不存在的情况下复制
            tobj[key] = sobj[key];
          }
        }
        return tobj;
      }
      
      
      var vehicle = {
        engines: 1,
        ignition: function() {
          console.log("点火器点着了");
        },
        drive: function() {
          this.ignition();
          console.log('发车啦');
        }
      }
      
      var car = mixin(vehicle, {
        wheels: 4,
        drive: function() {
          // vehicle.drive();
          //显示绑定 将vehicle.drive绑定到当前this上 this.ignition 调用的就是vehicle里的ignition方法
          vehicle.drive.call(this);
          console.log('轮子开始走了');
        }
      })
      
      var a = mixin(vehicle, {})
      
      // vehicle.drive()
      car.drive()
      // a.drive()
      
    • 寄生继承

      function Vehicle() {
        this.engines = 1;
      }
      
      Vehicle.prototype.ignition = function() {
        console.log('打开引擎');
      };
      Vehicle.prototype.drive = function() {
        this.ignition();
        console.log('开始走');
      };
      
      function Car() {
        var car = new Vehicle(); //实例化一个Vehicle对象
        car.wheels = 4; //加入新的属性
        var vehDrive = car.drive; //维持一个函数drive的引用
        car.drive = function() { //重写drive 
          // vehDrive(); 
          vehDrive.call(this); //绑定到当前this
          console.log(this.wheels + '走起~');
        }
        return car;
      }
      
      var  aCar = new Car();
      aCar.drive();
      aCar.ignition();
      
      
  2. 隐式混入 在构造函数调用或者方法调用中使用call,把某个对象的某个属性绑定进来

    var a = {
        say: function() {
            this.name  = 'zz';
            this.age = '18'
        }
    }
    
    var b = {
       say1:function() {
           a.say.call(this) //隐式混入 
       }
    }
    

    a.say()中的赋值操作都会应用在b上而不是a上

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值