定义类
类声明
定义类的一种方法是使用类声明。要声明一个类,你可以使用带有class
关键字的类名。ES6引入了基于类的语法,使得对象的创建更加接近传统的面向对象编程语言。
class MyClass {
// 构造函数
constructor() {
// 构造函数体
}
// 实例字段
myField = "foo";
// 实例方法
myMethod() {
// myMethod 体
}
// 静态字段
static myStaticField = "bar";
// 静态方法
static myStaticMethod() {
// myStaticMethod 体
}
// 静态块
static {
// 静态初始化代码
}
// 字段、方法、静态字段、静态方法、静态块都可以使用私有形式
#myPrivateField = "bar";
}
函数构造器
在ES6之前,JavaScript使用构造函数和原型链来创建具有类似特性的对象。这种方式不使用 class
关键字,而是使用普通函数和 new
关键字来创建对象。
使用函数作为构造函数。上面的模式大致可以转换为以下函数构造器:
function MyClass() {
this.myField = "foo";
// 构造函数体
}
MyClass.myStaticField = "bar";
MyClass.myStaticMethod = function () {
// myStaticMethod 体
};
MyClass.prototype.myMethod = function () {
// myMethod 体
};
(function () {
// 静态初始化代码
})();
function Pig(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
Pig.prototype.speak = function() {
console.log('Oink!');
};
let piggy = new Pig('Porky', 2, 'Male');
piggy.speak(); // Oink!
在这个例子中,Pig
是一个构造函数,用来初始化新对象的 name
、age
和 gender
属性。speak
方法被添加到 Pig
的原型上,这意味着所有通过 Pig
构造函数创建的对象都共享这个方法。
注意
- 实例化函数构造器时没有参数时可以省略
()
类表达式
类表达式是定义类的另一种方法。类表达式可以命名或不命名。命名类表达式的名称是该类体的局部名称。也就是通过对象字面量来定义类。
这种方法已经直接创建了对象
// 未命名/匿名类
let Rectangle = class {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
console.log(Rectangle.name);
// output: "Rectangle"
// 命名类 此时Rectangle的类名为Rectangle2
let Rectangle = class Rectangle2 {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
console.log(Rectangle.name);
// 输出:"Rectangle2"
约定写法
- 它们的命名以大写字母开头
- 它们只能能由
new
操作符来执行
创建对象
在声明一个类后,可以通过 new
运算符来创建它的实例。
const myInstance = new MyClass();
console.log(myInstance.myField); // 'foo'
myInstance.myMethod();