JavaScript 如何写类

在前端开发里,“类”是组织代码的重要工具,能把相同类型的对象(比如“用户”“商品”)的共性属性和方法打包在一起,不用反复写重复代码。很多刚接触JavaScript的开发者会疑惑,为什么明明有函数,还要专门学写类?其实JavaScript的类是ES6之后推出的“语法糖”——本质还是基于它原本的原型机制,但写法更贴近大家熟悉的面向对象概念,上手也简单。

最基础的写法:用class关键字定义类

写JavaScript的类,最直接的是用class关键字,就像给“模板”起个名字,比如要做一个“外卖订单”的模板,就可以这么写:

JavaScript 如何写类

`javascript

class Order {

// 构造函数:用来给新订单设置初始信息,就像填订单的必填项

constructor(菜品, 数量) {

this.菜品 = 菜品; // 每个订单自己的菜品名,不能共用

this.数量 = 数量; // 每个订单的数量

this.状态 = "待接单"; // 初始状态都是待接单,属于所有订单的默认值

}

// 类里的方法:所有订单都能调用的通用功能,不用每个订单单独写

计算总价() {

// 假设菜品单价是20元,就像外卖平台的固定定价

return this.数量 * 20;

}

修改状态(新状态) {

this.状态 = 新状态;

console.log(订单${this.菜品}状态更新为:${新状态});

}

}

`

用这个“模板”生成具体订单,只要用new关键字:

`javascript

// 生成一个具体的外卖订单:买2份宫保鸡丁

const 我的订单 = new Order("宫保鸡丁", 2);

console.log(我的订单.菜品); // 输出:宫保鸡丁

console.log(我的订单.计算总价()); // 输出:40

我的订单.修改状态("已派送"); // 输出:订单宫保鸡丁状态更新为:已派送

`

这个例子里,constructor是类的“初始化器”,负责给每个新对象赋初始值;类里的函数(比如计算总价)是所有实例共享的方法,不用重复创建,省内存。

进阶用法:让类继承,减少重复代码

如果要做“会员订单”,它和普通订单有很多共性(菜品、数量、状态),但多了“会员折扣”的属性,不用重新写一遍所有代码,只要让会员订单继承普通订单就行:

`javascript

// 用extends实现继承,Order是父类,MemberOrder是子类

class MemberOrder extends Order {

// 子类的构造函数:要先调用父类的构造,用super()

constructor(菜品, 数量, 会员等级) {

super(菜品, 数量); // 把父类要求的参数传给父类初始化

this.会员等级 = 会员等级; // 新增的会员属性

}

// 重写父类的计算总价:会员有8折优惠

计算总价() {

// 先调用父类的计算结果,再乘以0.8

return super.计算总价() * 0.8;

}

}

`

用这个子类生成会员订单:

`javascript

const 会员订单 = new MemberOrder("麻婆豆腐", 3, "黄金会员");

console.log(会员订单.计算总价()); // 普通总价60,打8折后是48

// 还能调用父类的方法,因为继承了Order

会员订单.修改状态("已付款"); // 正常输出状态更新

`

这种继承就像“升级版说明书”,既有旧说明书的所有功能,又加了新内容,不会重复写相同的规则,代码更整洁。

常见误区:别把类和普通函数搞混

有些新手会问:“我用函数也能实现一样的功能,为什么用类?”其实类和普通函数的核心区别是:类必须用new调用,否则会报错;而普通函数可以直接调用。比如下面的错误写法:

`javascript

// 直接调用类会报错!

const 错误调用 = Order("鱼香肉丝",1); // 报错:Class constructor Order cannot be invoked without 'new'

`

另外,类里的方法默认是不可枚举的,而普通函数如果直接绑在对象上,会遍历出来,这也是类的优势之一——不会意外改动通用方法。

简单来说,JavaScript写类的核心就是:用class定义模板,constructor设初始值,方法写通用功能,继承实现代码复用。只要记住“类是模板,new生成具体实例”,就能轻松上手,不用纠结底层的原型机制,先会用,再慢慢理解背后的逻辑就好。

上一篇 TypeScript 装饰器执行顺序