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

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

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

相关推荐
newxtc36 分钟前
【爱给网-注册安全分析报告-无验证方式导致安全隐患】
前端·chrome·windows·安全·媒体
一个很帅的帅哥1 小时前
axios(基于Promise的HTTP客户端) 与 `async` 和 `await` 结合使用
javascript·网络·网络协议·http·async·promise·await
dream_ready2 小时前
linux安装nginx+前端部署vue项目(实际测试react项目也可以)
前端·javascript·vue.js·nginx·react·html5
编写美好前程2 小时前
ruoyi-vue若依前端是如何防止接口重复请求
前端·javascript·vue.js
flytam2 小时前
ES5 在 Web 上的现状
前端·javascript
喵喵酱仔__2 小时前
阻止冒泡事件
前端·javascript·vue.js
GISer_Jing2 小时前
前端面试CSS常见题目
前端·css·面试
某公司摸鱼前端2 小时前
如何关闭前端Chrome的debugger反调试
javascript·chrome
八了个戒2 小时前
【TypeScript入坑】什么是TypeScript?
开发语言·前端·javascript·面试·typescript
不悔哥2 小时前
vue 案例使用
前端·javascript·vue.js