知道 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可以看作是一个语法糖,它本质上是基于原型的面向对象编程,但是提供了更加清晰、易于理解和易于维护的语法。在类中,我们可以定义构造函数、原型方法、静态方法和属性,以及访问器等,可以满足不同的编程需求。同时,类还支持继承和多态等高级用法,可以帮助我们更加灵活地组织和管理代码。

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

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

相关推荐
蜗牛快跑2135 分钟前
面向对象编程 vs 函数式编程
前端·函数式编程·面向对象编程
Dread_lxy6 分钟前
vue 依赖注入(Provide、Inject )和混入(mixins)
前端·javascript·vue.js
涔溪1 小时前
Ecmascript(ES)标准
前端·elasticsearch·ecmascript
用户3157476081351 小时前
成为程序员的必经之路” Git “,你学会了吗?
面试·github·全栈
榴莲千丞1 小时前
第8章利用CSS制作导航菜单
前端·css
奔跑草-1 小时前
【前端】深入浅出 - TypeScript 的详细讲解
前端·javascript·react.js·typescript
羡与1 小时前
echarts-gl 3D柱状图配置
前端·javascript·echarts
guokanglun1 小时前
CSS样式实现3D效果
前端·css·3d
咔咔库奇1 小时前
ES6进阶知识一
前端·ecmascript·es6
前端郭德纲1 小时前
浏览器是加载ES6模块的?
javascript·算法