侧边栏壁纸
博主头像
MicroMatrix博主等级

曲则全,枉则直,洼则盈,敝则新,少则得,多则惑。是以圣人抱一为天下式。不自见,故明;不自是,故彰;不自伐,故有功;不自矜,故长。夫唯不争,故天下莫能与之争。古之所谓“曲则全”者,岂虚言哉!诚全而归之。

  • 累计撰写 80 篇文章
  • 累计创建 21 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

《你不知道的JavaScript》第四章笔记

蜗牛
2024-01-31 / 0 评论 / 0 点赞 / 25 阅读 / 4166 字 / 正在检测是否收录...

类理论

类是对现实世界实体的抽象,通过封装数据和相关的操作方法。继承允许创建基于通用类的专门化子类。这样的结构促进了代码重用和组织。在类层次结构中,子类可以重写父类方法以展现特定行为,这种机制称为多态。面向对象编程将数据结构视为具有相关操作的实体,以整洁的方式模拟现实世界的复杂性。

类是一种设计模式。许多语言提供了对于面向类软件设计的原生语法。JavaScript 也有类
似的语法,但是和其他语言中的类完全不同。

类的机制

类的机制提供了一个框架,允许我们创建数据和方法的蓝图。这个蓝图(类)可以用来实例化对象,这些对象具备了类定义的属性和行为。通过继承,一个类可以基于另一个类来创建,继承其属性和方法,同时还可以添加或改写特定的功能。多态性允许方法在不同的上下文中呈现不同的行为,而共享的方法名增强了代码的表现力和灵活性。简而言之,类使得代码更加模块化,易于管理和扩展。

类的继承

类的继承是一种机制。它可以让子类继承父类的方法和属性。这样,子类可以重用父类的代码,减少了重复,并且可以通过添加新方法或重写现有方法来扩展或定制其行为。在继承链中,多态允许我们编写可适用于父类及其任何子类的代码,并且在运行时能够根据对象的实际类型来确定调用哪个方法。例如下面的代码:

// 定义一个父类
class Vehicle {
  constructor(brand, model) {
    this.brand = brand;
    this.model = model;
  }

  // 定义一个方法,子类将覆盖此方法来展示多态
  startEngine() {
    console.log(`Engine of ${this.brand} ${this.model} is starting...`);
  }
}

// 定义一个子类,继承自Vehicle
class Car extends Vehicle {
  constructor(brand, model) {
    super(brand, model);
  }

  // 覆盖父类的startEngine方法
  startEngine() {
    console.log(`Engine of ${this.brand} ${this.model}, which is a Car, is starting with a vroom...`);
  }
}

// 定义另一个子类,同样继承自Vehicle
class Truck extends Vehicle {
  constructor(brand, model) {
    super(brand, model);
  }

  // 同样覆盖父类的startEngine方法
  startEngine() {
    console.log(`Engine of ${this.brand} ${this.model}, which is a Truck, is starting with a rumble...`);
  }
}

// 实例化Car类
let myCar = new Car('Toyota', 'Corolla');
myCar.startEngine(); // 调用Car类的startEngine方法

// 实例化Truck类
let myTruck = new Truck('Ford', 'F-150');
myTruck.startEngine(); // 调用Truck类的startEngine方法

多重继承就是一个子类继承了多个父类,但是这样会导致一些问题。例如继承的2个父类中有同样的方法或者属性,那么该使用谁呢。基于种种问题,多重继承并不被推荐使用。

混入

在继承或者实例化时,JavaScript的对象机制并不会自动执行复制行为。简单来说,JavaScript 中只有对象,并不存在可以被实例化的“类”。一个对象并不会被复制到其他对象,它们会被关联起来。
由于在其他语言中类表现出来的都是复制行为,因此 JavaScript 开发者也想出了一个方法来模拟类的复制行为,这个方法就是混入。接下来我们会看到两种类型的混入:显式和隐式。

  • 显式混入​:像Object.assign()这样的工具可以将一个对象的属性复制到另一个对象上,这是一种显式的方式。
  • 隐式混入​:通过使用.call().apply()方法将一个对象的上下文(this)更改为另一个对象,然后执行函数。

混入可以提供一个轻量级,更易于理解和维护的方式来共享功能。但是,它们也有潜在的缺点,比如可能导致属性名冲突,或者在混入的属性和方法之间产生隐秘的依赖关系。此外,因为混入通常涉及复制属性,所以它们并不适合复制复杂的、引用其他对象的属性。而且会产生代码语法和维护的问题。

0

评论区