推荐答案
// www.javascriptcn.com code example
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex', 'German Shepherd');
dog.speak(); // 输出: Rex barks.本题详细解读
1. class 关键字的基本用法
class 关键字用于定义一个类。类是 JavaScript 中面向对象编程的基础,它允许你创建具有属性和方法的对象。类定义的基本语法如下:
// www.javascriptcn.com code example
class ClassName {
constructor(parameters) {
// 初始化属性
}
method1() {
// 方法定义
}
method2() {
// 方法定义
}
}constructor方法是类的构造函数,用于初始化对象的属性。当你使用new关键字创建类的实例时,constructor方法会被自动调用。- 类中的方法定义不需要使用
function关键字。
2. 类的继承
JavaScript 中的类支持继承,使用 extends 关键字可以实现类的继承。子类可以继承父类的属性和方法,并且可以重写父类的方法。
// www.javascriptcn.com code example
class ChildClass extends ParentClass {
constructor(parameters) {
super(parameters); // 调用父类的构造函数
// 初始化子类的属性
}
method1() {
// 重写父类的方法
}
}super关键字用于调用父类的构造函数或方法。在子类的构造函数中,super必须在使用this关键字之前调用。
3. 静态方法和属性
类还可以定义静态方法和属性,这些方法和属性属于类本身,而不是类的实例。静态方法通常用于执行与类相关的操作,而不是与实例相关的操作。
// www.javascriptcn.com code example
class MyClass {
static staticMethod() {
console.log('This is a static method.');
}
static staticProperty = 'This is a static property.';
}
MyClass.staticMethod(); // 输出: This is a static method.
console.log(MyClass.staticProperty); // 输出: This is a static property.- 静态方法和属性通过类名直接调用,而不是通过类的实例调用。
4. 类的实例化
使用 new 关键字可以创建类的实例。实例化类时,会调用类的构造函数,并返回一个新的对象。
const instance = new ClassName(parameters);
- 实例化类时,可以传递参数给构造函数,这些参数会用于初始化对象的属性。
5. 类的私有字段和方法
从 ES2022 开始,JavaScript 支持私有字段和方法。私有字段和方法只能在类的内部访问,外部无法直接访问。
// www.javascriptcn.com code example
class MyClass {
#privateField = 'private';
#privateMethod() {
console.log('This is a private method.');
}
publicMethod() {
console.log(this.#privateField);
this.#privateMethod();
}
}
const instance = new MyClass();
instance.publicMethod(); // 输出: private 和 This is a private method.- 私有字段和方法使用
#前缀定义,只能在类的内部访问。
6. 类的 getter 和 setter
类中可以定义 getter 和 setter 方法,用于控制对类属性的访问和修改。
// www.javascriptcn.com code example
class MyClass {
constructor() {
this._value = 0;
}
get value() {
return this._value;
}
set value(newValue) {
if (newValue >= 0) {
this._value = newValue;
}
}
}
const instance = new MyClass();
instance.value = 10;
console.log(instance.value); // 输出: 10getter和setter方法允许你在访问或修改属性时执行自定义的逻辑。
7. 类的 this 绑定
在类的方法中,this 关键字指向当前实例。如果方法被提取出来单独使用,this 可能会丢失绑定。为了避免这种情况,可以使用箭头函数或 bind 方法来绑定 this。
// www.javascriptcn.com code example
class MyClass {
constructor() {
this.value = 42;
this.method = this.method.bind(this);
}
method() {
console.log(this.value);
}
arrowMethod = () => {
console.log(this.value);
}
}
const instance = new MyClass();
const method = instance.method;
const arrowMethod = instance.arrowMethod;
method(); // 输出: 42
arrowMethod(); // 输出: 42- 箭头函数会自动绑定
this,而普通函数需要使用bind方法来绑定this。