Menu
CoddyTech

“has-a”与“is-a”关系

本课属于 Coddy JavaScript 学习旅程的“面向对象编程”单元。第 47 课,共 56 课。

在面向对象编程中,对象之间主要有两种关系:“有一个”(组合)和“是一个”(继承)。继承会创建父子层级关系,而组合则通过组合较小且专注的组件来构建对象。

我们先通过继承来了解“is-a”关系:

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  eat() {
    console.log(`${this.name} is eating.`);
  }
}

// Dog “is-a” Animal:继承关系
class Dog extends Animal {
  bark() {
    console.log(`${this.name} says woof!`);
  }
}

现在,我们通过组合来看看“拥有”关系:

class Engine {
  start() {
    console.log("Engine started");
  }
}

// Car "has-a" Engine:组合关系
class Car {
  constructor() {
    this.engine = new Engine(); // 组合
  }
  
  startCar() {
    this.engine.start();
    console.log("Car is running");
  }
}

关键区别:

  • “is-a”(继承):Dog 是一种 Animal
  • “has-a”(组合):Car 有一个 Engine
challenge icon

挑战

已提供组件类(Processor、Memory)以及大部分 Computer 类。你的任务是完成 computer.js 文件中的构造函数:

  1. 使用 Processor 类创建一个 processor 属性
  2. 使用 Memory 类创建一个 memory 属性
  3. 将 processorSpeed 传递给 Processor 构造函数,并将 memorySize 传递给 Memory 构造函数

亲手试试

import { Computer } from './computer.js';

const myComputer = new Computer(3.5, 16);
myComputer.start();
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: JavaScript 在线编译器