第14课:小白进阶必看!面向对象编程——用“乐高思维”组装代码

60 阅读2分钟

只要心怀希望,就没有到不了的远方!

你是否觉得代码越来越复杂,像一堆散落的积木难以管理?本节课将教你用 面向对象编程(OOP) 的思维,像搭乐高一样组织代码,通过「类与对象」「继承」打造可复用的代码模块!最后开发「动物世界模拟器」,让小猫小狗在网页上活起来!

一、面向对象核心概念

1. 类 vs 对象:蓝图与实物

  • 类(Class):设计图纸(比如“汽车设计图”)

  • 对象(Object):根据图纸制造的实物(比如“一辆红色宝马”)

2. 面向对象三大特性

特性比喻作用
封装手机外壳包裹电路隐藏细节,暴露安全接口
继承子承父业复用已有类的功能
多态同一接口不同表现不同对象调用相同方法结果不同

二、构造函数与原型链

1. 构造函数:对象的“施工队”

 function Dog(name, age) {
    // 属性初始化
    this.name = name;
    this.age = age;
    // 方法定义
    this.bark = function () {
        console.log(this.name + this.age + '岁了,' + '旺旺旺旺!');
    };
}
// 创建实例
const myDog = new Dog('旺财', 2);
myDog.bark(); //旺财2岁了,旺旺旺旺!

2. 原型链:家族的“传家宝”

// 通过原型共享方法(节省内存)
Dog.prototype.eat = function() {
  console.log(this.name + '在啃骨头~');
};
myDog.eat(); // 旺财在啃骨头~

三、Class 语法糖:更现代的写法

1. 基础类定义

class Animal {
    constructor(name) {
        this.name = name;
    }
    // 方法(自动挂载到原型)
    speak() {
        console.log(`${this.name}发出声音`);
    }
}
const animal = new Animal('小狗');
animal.speak(); // 小狗发出声音

2. 继承:子类复用父类能力

class Cat extends Animal {
  constructor(name, color) {
    super(name); // 调用父类构造函数
    this.color = color;
  }
  // 重写父类方法
  speak() {
    super.speak(); // 可选:先执行父类方法
    console.log('喵喵~');
  }
}
const myCat = new Cat('咪咪', '白色');
myCat.speak();
// 输出:
// 咪咪发出声音
// 喵喵~

四、实战:动物世界模拟器

1. 功能演示

2. 完整代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button onclick="createCat()">生成猫咪</button>
    <button onclick="createDog()">生成小狗</button>
    <div id="animalList"></div>

    <script>
        class Animal {
            constructor(name) {
                this.name = name;
                this.id = Date.now();
            }
            introduce() {
                return `我是 ${this.name}`;
            }
        }

        class Cat extends Animal {
            constructor(name) {
                super(name);
            }
            speak() {
                return '喵~';
            }
        }

        class Dog extends Animal {
            constructor(name) {
                super(name);
            }
            speak() {
                return '汪!';
            }
        }

        function createCat() {
            const cat = new Cat('猫咪' + Math.floor(Math.random() * 100));
            showAnimal(cat);
        }

        function createDog() {
            const dog = new Dog('小狗' + Math.floor(Math.random() * 100));
            showAnimal(dog);
        }

        function showAnimal(animal) {
            const div = document.createElement('div');
            div.innerHTML = `
        <p>${animal.introduce()},我的ID是 ${animal.id}</p>
        <button onclick="alert('${animal.speak()}')">叫一声</button>
      `;
            document.getElementById('animalList').appendChild(div);
        }
    </script>
</body>

</html>

五、常见问题解答

1. 为什么用面向对象?

  • 代码更易维护:修改猫的行为无需影响狗
  • 提升复用性:通过继承快速扩展功能
  • 更贴合现实思维:用“对象”描述事物更直观

2. 什么时候该用 class?

  • 需要创建多个相似对象时(如用户、商品)
  • 需要层次化组织功能时(如动物 → 猫 → 布偶猫)

3. 注意事项

  • constructor 是类的“初始化方法”,new 时自动调用
  • 类方法之间不需要逗号分隔
  • 静态方法用 static 关键字定义(类直接调用)

下节预告

第 15 课:设计模式——代码的“武林秘籍”

  • 单例模式:确保唯一实例

  • 观察者模式:实现消息通知

  • 实战:实现全局状态管理

回复【JS】获取本课源码+工具包!