知道 ES6 的 Class 嘛?

引言

如果大家学习过c++的话,class想必大家就听着很耳熟了,因为C++中就是使用关键字 class 来定义类,从而实现面向对象编程,那它和我们今天的内容有什么联系呢?

在ES6中JavaScript引入了Class关键字,没错,它就是为了面向对象编程而准备的,Class关键字的引入使得JavaScript中的面向对象编程更加直观和易用。Class关键字可以看做是一个语法糖,它本质上还是基于原型的面向对象编程。

定义类对象

在传统的JavaScript中,我们可以直接在函数对象上添加方法:

javascript 复制代码
function MyClass() {}  
MyClass.myMethod = function() {  
  console.log('This is a static method.');  
}  

使用class定义一个类非常简单,如下所示:

javascript 复制代码
class Person {  
  constructor(name, age) {  
    this.name = name;  
    this.age = age;  
  }  
    
  sayHello() {  
    console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);  
  }  
}  

在上面的例子中,我们定义了一个Person类,它有一个构造函数和一个sayHello方法。构造函数用于创建实例,sayHello方法用于打印实例的属性。我们使用new关键字来创建一个Person实例,然后调用sayHello方法来打印实例的属性。

定义静态方法和属性

在Class中,我们可以使用Static关键字来定义静态方法和属性。静态方法和属性是定义在类本身上,而不是定义在实例上。因此,在调用静态方法和属性时,我们不需要先创建类的实例。

让我们来看一个例子使用它来创建实例和访问静态属性:

javascript 复制代码
class Shape {  
  static PI = 3.14;  
  
  constructor(name) {  
    this.name = name;  
  }  
  
  static getPI() {  
    return Shape.PI;  
  }  
}  
   
const circle = new Shape('circle');  
console.log(circle.name); // circle  
   
console.log(Shape.getPI()); // 3.14  

在上面的例子中,我们定义了一个Shape类,它有一个静态属性PI和一个静态方法getPI。我们使用new关键字来创建一个Shape实例,然后访问实例的name属性。同时,我们也使用Shape.getPI()来访问静态属性PI。

定义访问器

除了构造函数和方法以外,类还可以定义访问器。访问器是一种特殊的方法,它可以用于对类的属性进行读取和写入操作。

来看看这个例子,展示一下如何使用访问器来定义类的属性:

kotlin 复制代码
class Person {  
  constructor(name, age) {  
    this._name = name;  
    this._age = age;  
  }  
  
  get name() {  
    return this._name;  
  }  
  
  set name(value) {  
    this._name = value;  
  }  
  
  get age() {  
    return this._age;  
  }  
  
  set age(value) {  
    if (value < 0) {  
      throw new Error('Age cannot be negative');  
    }  
    this._age = value;  
  }  
}  

在上面的例子中,我们使用get和set关键字来定义访问器。get用于读取属性值,set用于写入属性值。我们使用_name和_age来存储属性值,但是使用get和set来读取和写入属性值,以控制属性值的访问和修改。

继承和多态

当然,除了上面这些,class还提供了一些高级用法,如继承和多态。继承是一种通过已有的类创建新类的方法,新类可以继承已有类的属性和方法。多态是一种通过类的继承关系实现同名方法的不同实现的方法。

下面是一个展示如何使用class来实现继承和多态的例子:

scala 复制代码
class Animal {  
  constructor(name) {  
    this.name = name;  
  }  
  
  speak() {  
    console.log(`${this.name} makes a noise.`);  
  }  
}  
   
class Dog extends Animal {  
  speak() {  
    console.log(`${this.name} barks.`);  
  }  
}  
   
class Cat extends Animal {  
  speak() {  
    console.log(`${this.name} meows.`);  
  }  
}  
   
const dog = new Dog('Rufus');  
const cat = new Cat('Fluffy');  
   
dog.speak(); // Rufus barks.  
cat.speak(); // Fluffy meows.  

在上面的例子中,我们定义了Animal、Dog和Cat三个类。Dog和Cat都继承了Animal类的属性和方法,但是它们的speak方法的实现是不同的。我们使用new关键字来创建一个Dog实例和一个Cat实例,然后调用它们的speak方法,分别输出不同的结果。

总结

总的来说,class是一种新的语法,它提供了一种更加简洁和直观的方式来定义对象和对象的行为。class可以看作是一个语法糖,它本质上是基于原型的面向对象编程,但是提供了更加清晰、易于理解和易于维护的语法。在类中,我们可以定义构造函数、原型方法、静态方法和属性,以及访问器等,可以满足不同的编程需求。同时,类还支持继承和多态等高级用法,可以帮助我们更加灵活地组织和管理代码。

那么这篇文章就到这里结束啦~

如果你想了解更多这类文章,点赞关注作者更新更多~

相关推荐
前端_yu小白27 分钟前
js异步机制
前端·javascript·async·promise·await·js异步·回调地狱
Spider Cat 蜘蛛猫27 分钟前
chrome extension开发框架WXT之WXT Storage api解析【补充说明一】
前端·javascript·chrome
程序猿John4 小时前
ES6 新增特性 箭头函数
前端·javascript·es6
百锦再5 小时前
五种常用的web加密算法
前端·算法·前端框架·web·加密·机密
uhakadotcom5 小时前
RunPod:AI云计算的强大助手
后端·面试·github
@大迁世界5 小时前
彻底改变我 React 开发方式的组件模式
前端·javascript·react.js·前端框架·ecmascript
uhakadotcom5 小时前
Google AlloyDB AI 与 PostgreSQL 的核心区别
后端·面试·github
uhakadotcom5 小时前
使用Go语言编写简单爬虫程序
后端·面试·github
William Dawson6 小时前
【Vue 3 + Element Plus 实现产品标签的动态添加、删除与回显】
前端·javascript·vue.js
拉不动的猪6 小时前
项目基础搭建时的一些基本注意点
前端·javascript·面试