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

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

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

相关推荐
Nan_Shu_61416 分钟前
学习: Threejs (2)
前端·javascript·学习
G_G#24 分钟前
纯前端js插件实现同一浏览器控制只允许打开一个标签,处理session变更问题
前端·javascript·浏览器标签页通信·只允许一个标签页
@大迁世界39 分钟前
TypeScript 的本质并非类型,而是信任
开发语言·前端·javascript·typescript·ecmascript
GIS之路1 小时前
GDAL 实现矢量裁剪
前端·python·信息可视化
是一个Bug1 小时前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu121381 小时前
React面向组件编程
开发语言·前端·javascript
学历真的很重要1 小时前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
持续升级打怪中1 小时前
Vue3 中虚拟滚动与分页加载的实现原理与实践
前端·性能优化
GIS之路1 小时前
GDAL 实现矢量合并
前端
hxjhnct1 小时前
React useContext的缺陷
前端·react.js·前端框架