js 实现类
在JavaScript中实现类(Class)可以通过多种方式,以下是常见的几种方法:
使用ES6的class语法
ES6引入了class关键字,提供更接近传统面向对象语言的语法:
class Person {
constructor(name) {
this.name = name;
}
greet() {
return `Hello, ${this.name}!`;
}
}
const person = new Person('Alice');
console.log(person.greet()); // 输出: Hello, Alice!
使用构造函数和原型链(ES5方式)
在ES6之前,通常通过构造函数和原型链实现类:
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
return 'Hello, ' + this.name + '!';
};
var person = new Person('Bob');
console.log(person.greet()); // 输出: Hello, Bob!
使用工厂函数
工厂函数返回一个新对象,适合不需要继承的场景:
function createPerson(name) {
return {
name,
greet() {
return `Hello, ${this.name}!`;
}
};
}
const person = createPerson('Charlie');
console.log(person.greet()); // 输出: Hello, Charlie!
使用闭包实现私有成员
通过闭包可以模拟私有变量:
class Counter {
#count = 0; // 私有字段
increment() {
this.#count++;
}
getCount() {
return this.#count;
}
}
const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 输出: 1
使用静态方法和属性
静态成员属于类本身而非实例:
class MathUtils {
static PI = 3.14159;
static square(x) {
return x * x;
}
}
console.log(MathUtils.square(2)); // 输出: 4
继承的实现
通过extends实现继承:

class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
super.speak(); // 调用父类方法
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak();
注意事项
- ES6的
class本质仍是基于原型的语法糖 - 类声明不会提升(hoist),必须先定义后使用
- 类方法默认不可枚举
- 类内部默认启用严格模式






