初识JS中的“类”

本文章仅供本菜鸟记录学习过程:
最近在看《你不知道的JS》这本书:
类是一种设计模式,JS中其实并没有真正的类,但是设计出了与类相似的代码模式
类的继承概念不再赘述,下面解析一下几个概念

多态:
多态指的是任何方法都可以引用,继承层次中高层的方法(即子类可以引用,继承父类身上的方法),其中,方法的多态性取决于你是在哪个类的实例中引用它。
下面是一段伪代码:

class Vehicle {//这个是交通工具父类,定义了一个属性两个方法
      engines = 1
      ignition() { output("Turning on my engine.");
      }
      drive() { ignition(); output("Steering and moving forward!") 
      }
    }
    class Car inherits Vehicle {//这个车辆子类,有一个从父类继承来的方法
      wheels = 4
      drive() { inherited: drive()         output("Rolling on all ", wheels, " wheels!") }
    }

    class SpeedBoat inherits Vehicle {//这个游艇子类,定义了一个属性需要先接收来自父类的方法
      engines = 2
      ignition() { output("Turning on my ", engines, " engines.") }
      pilot() { inherited: drive()         
      output("Speeding through the water with ease!") }
    }

问题:最后一个子类中的pilot() 方法继承的这个方法drive()需要调用一个方法ignition() ,而这个方法在父类Vehicle和子类SpeedBoat中都有,用的是哪一个呢?

答:如果在这个SpeedBoat子类的实例中调用,那么使用的就是这个子类中的 ignition() 方法,如果直接实例化那个父类,那么使用的就是父类中的 ignition() 方法 。这里的调用逻辑类似于原型链,需要先在自身上找有没有这个方法,如果没有的话就到父类上找。

super
在子类(而不是它们创建的实例对象!)中,子类也可以相对引用它继承的父类,这种相对引用通常被称为 super。
在这里插入图片描述
图中的Foo代表父类,Bar代表子类,而旁边是它们的实例,在Bar类中可以通过(super)访问父类中的方法,注意:子类得到的仅仅是继承自父类行为的一份副本,在子类中重写的方法并不会影响父类中原有的方法(类的继承其实就是复制)。

在js中的实现方法:
这里书的作者称其为混入:

function mixin( sourceObj, targetObj ) 
{ for (var key in sourceObj) { 
  // 只会在不存在这些属性的的情况下复制,两个循环语句将sourceObj里目标对象没有的属性赋给它,而对于子类重写了的方法则不覆盖
  if (!(key in targetObj)) {
  targetObj[key] = sourceObj[key]; 
} }
return targetObj; }
var Vehicle = { 
  engines: 1,
  ignition: function() { console.log( "Turning on my engine." ); 		 },
  drive: function() { this.ignition(); console.log( "Steering and moving forward!" ); } };

var Car = mixin( 
  Vehicle, { wheels: 4,
  drive: function() { 
  Vehicle.drive.call( this ); 
  console.log( "Rolling on all " + this.wheels + " wheels!" ); 
} } );

这种复制方法复制的是引用类型的引用和基本类型的值,所以其实 ignition 属性两个对象调用的是内存中的同一个函数。

下次学习过程中有机会再更新。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值