深入浅出:JavaScript ES6中类(Class)的革新与实践

ES6--class类(详解/看完必会) ES6中class类的学习,看完必会 阅读详情

深入浅出:JavaScript ES6中类(Class)的革新与实践

在JavaScript的发展历程中,ES6(ECMAScript 2015)无疑是一个里程碑式的版本。它不仅引入了let、const、箭头函数等特性,更通过**类(Class)**的语法革新,彻底改变了开发者对面向对象编程的理解与实践。本文将带你深入浅出地了解ES6类的核心功能,从定义到特点,再到与传统方法的对比,最后总结关键注意事项,帮助你在实际开发中游刃有余。


一、类的定义:语法糖背后的原型本质

1.1 类的基本结构

在ES6中,类的定义通过class关键字完成,其核心由构造函数(constructor)和方法组成。例如:

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  // 实例方法
  sayHello() {
    console.log(`Hello, I'm ${this.name}, ${this.age} years old.`);
  }

  // 静态方法
  static compareAge(person1, person2) {
    return person1.age - person2.age;
  }
}

const alice = new Person("Alice", 25);
alice.sayHello(); // 输出: Hello, I'm Alice, 25 years old.

1.2 类的本质:语法糖 vs 原型链

尽管ES6的类看起来像传统面向对象语言(如Java、C++)的语法,但其本质是基于原型链的语法糖。类方法实际上被挂载到原型上,而构造函数负责初始化实例属性。例如,Person.prototype中会包含sayHello方法,而this.name和this.age是实例属性。

// 等价于ES5的原型链写法
function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.sayHello = function() {
  console.log(`Hello, I'm ${this.name}, ${this.age} years old.`);
};

这种设计既保留了JavaScript的灵活性,又提升了代码的可读性和可维护性。


二、类的特点:简洁性与灵活性的平衡

2.1 继承机制:extends与super

ES6通过extends关键字实现类的继承,结合super调用父类构造函数,使继承逻辑更加直观。例如:

class Student extends Person {
  constructor(name, age, grade) {
    super(name, age); // 调用父类构造函数
    this.grade = grade;
  }

  study() {
    console.log(`${this.name} is studying in grade ${this.grade}.`);
  }
}

const student = new Student("Charlie", 18, 12);
student.sayHello(); // 继承父类方法
student.study();    // 输出: Charlie is studying in grade 12.

2.2 静态方法与访问器属性

  • 静态方法:通过static关键字定义,直接通过类调用,无需实例化。
  • 访问器属性:通过get和set定义,用于控制属性的读取和赋值逻辑。
class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }

  set fullName(name) {
    [this.firstName, this.lastName] = name.split(" ");
  }
}

const person = new Person("John", "Doe");
console.log(person.fullName); // 输出: John Doe
person.fullName = "Jane Smith";
console.log(person.firstName); // 输出: Jane

三、与旧方法的对比:ES5 vs ES6

特性ES5 传统写法ES6 类语法
代码可读性原型链操作冗长,逻辑分散语法简洁,结构清晰
继承实现需手动绑定原型链,代码复杂使用extends和super,语法直观
变量提升函数声明会被提升类声明不会被提升,需先定义再使用
this的绑定方法中的this容易丢失可通过箭头函数或绑定this解决
模块化支持需借助IIFE或模块加载器直接支持import/export

3.1 示例对比

ES5写法:

function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.sayHello = function() {
  console.log(`Hello, I'm ${this.name}, ${this.age} years old.`);
};

function Student(name, age, grade) {
  Person.call(this, name, age);
  this.grade = grade;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.study = function() {
  console.log(`${this.name} is studying in grade ${this.grade}.`);
};

ES6写法:

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  sayHello() {
    console.log(`Hello, I'm ${this.name}, ${this.age} years old.`);
  }
}

class Student extends Person {
  constructor(name, age, grade) {
    super(name, age);
    this.grade = grade;
  }
  study() {
    console.log(`${this.name} is studying in grade ${this.grade}.`);
  }
}

ES6的写法明显更简洁,且逻辑更集中,避免了ES5中复杂的原型链操作。


四、注意事项:避免踩坑的关键点

4.1 类声明的提升问题

与函数声明不同,类声明不会被提升(hoisted)。这意味着你必须先定义类,再实例化它,否则会抛出引用错误。

// 错误示例:类未定义
const person = new Person("Alice", 25); 
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

4.2 this的绑定问题

在类的方法中,this的指向取决于调用者。如果方法被单独调用(如作为回调函数),this可能指向undefined或全局对象。解决方法包括:

  • 使用箭头函数(自动绑定this):
    class Person {
      constructor() {
        this.handleClick = () => {
          console.log(this); // 正确指向实例
        };
      }
    }
    
  • 在构造函数中显式绑定:
    constructor() {
      this.handleClick = this.handleClick.bind(this);
    }
    

4.3 类中的属性定义

  • 实例属性:在constructor中通过this.xxx定义。
  • 原型属性:直接在类中定义的方法,挂载到原型上。
  • 类属性:通过静态方法或直接赋值给类本身。
class Person {
  constructor() {
    this.instanceProp = "实例属性"; // 实例属性
  }
  prototypeProp() { } // 原型方法
}
Person.classProp = "类属性"; // 类属性

4.4 构造函数的限制

  • 类的构造函数不能是生成器函数(function*)。
  • 构造函数不能使用预计算属性名(如[key])。
  • 如果未显式定义constructor,会自动生成一个空构造函数。

五、未来展望:ES6类的演进

ES6类的设计为后续版本的JavaScript奠定了基础。例如:

  • 私有属性和方法(ES2022):通过#符号定义私有成员。
    class Person {
      #secret = "秘密"; // 私有属性
      revealSecret() {
        console.log(this.#secret); // 私有方法
      }
    }
    
  • 类字段声明(ES2022):允许在类体中直接声明实例属性。
    class Person {
      name = "默认值"; // 类字段
    }
    

这些特性进一步增强了类的封装性和灵活性,推动JavaScript向更现代化的编程语言演进。


六、总结

ES6的类功能不仅是JavaScript语法的革新,更是面向对象编程理念的升华。通过简洁的语法和灵活的继承机制,它让开发者能够更高效地构建复杂的应用程序。然而,理解其底层原理(如原型链)和潜在陷阱(如this绑定)同样重要。掌握这些知识,不仅能帮助你写出更优雅的代码,还能让你在调试和优化中事半功倍。

在未来的开发中,随着ES6及后续版本的普及,类将继续作为JavaScript的核心特性之一,成为现代前端开发不可或缺的工具。无论是构建React组件、Vue实例,还是设计复杂的业务逻辑,类都将是你最得力的助手。

ES6中的Class方法与早期JavaScript方法有哪些本质区别 在ES6中引入了class 使JavaScript 的面向对象编程更加直观和简洁变得容易使用,它在功能性、使用技巧和对象编程上更加直观了,其底层的原型及本质上依然是语法糖的方式实现相关不大。特点ES6 class早期JavaScript语法简洁,类似传统面向对象语言基于构造函数和原型链继承使用 extends 和 super手动设置原型链静态方法使用 static 关键字直接挂载到构造函数上私有属性支持(ES2022)需要通过闭包模拟getter和setter支持。 阅读详情

相关推荐

【微知】关于GB200 NVL72服务器的一些信息?(36CPU72GPU;LPDDR5X 17T;HBM3e 13.5T;5代NVlink 1.8TB; 720P算力FP8;120Kw)

本文仅根据官网介绍分析,存在纰漏仅供参考。

技术札记 5385

JS es6的Class类详解

文章目录JS es6的Class类详解class基本语法Class的基本语法之constructorClass的基本语法之类的调用方式Class的基本语法之getter和setterClass的基本语法之类的属性名Class的基本语法的特别注意点Class的静态属性和方法Class的私有方法和私有属性构造函数的新属性构造函数的新属性 JS es6的Class类详解 class基本语法 JavaScript 语言中,生成实例对象的传统方法是通过构造函数和原型的组合模式.ES6 提供了更接近传统语言(java)

weixin_44691513的博客 3万+

Matlab2021a破解版安装与激活实战教程(含详细步骤截图)

本文详细介绍了MATLAB R2021a的正版安装流程与核心功能优化,包括系统要求、安装步骤、性能调优及深度学习工具箱的应用。通过实战教程和代码示例,帮助用户高效搭建开发环境并掌握关键技术,特别适合工程计算与科学研究的专业人士。

vvv99的博客 460

ES6 中的类(class)

ES6 引入的 class 关键字具有定义类的能力。类是 ECMAScript 中新的基础性语法糖。虽然 ES6 表面上看起来可以支持正式的面向对象编程,但实际上它背后使用的依旧是原型和构造函数的概念。(笔记内容参考《JavaScript 高级程序设计(第4版)》章节8.4 类以前在笔记《js 中原型、原型链和继承概念(详细全面)》中简要提过部分内容,这里系统看一次。类声明和类表达式。两种方式都需要使用 class 关键字加大括号定义。类表达式与函数表达式类似,在它们被求值前都不能被引用。

TKOP_的博客 2008

GPD源码分析

gpd使用示例 先看下面一段代码,为标准gpd算法的使用方法,可以看到输入为点云,cloud_camera_; 输入:std::unique_ptr<gpd::util::Cloud> cloud_camera_ 输出: std::vector<std::unique_ptr<gpd::candidate::Hand>> grasps; // detect grasp poses gpd对象:std::unique_ptr<gpd::GraspDetect.

weixin_41003113的博客 2332

3DMax高效建模与人工智能:一场颠覆传统创作的效率革命

AI与3DMax的结合,不仅是工具效率的升级,更是一场创作范式的革命。从“手动雕刻”到“智能共生”,设计师的角色正从执行者转向决策者。正如网友所言:“AI不是替代人类,而是赋予凡人以神笔。”在这场变革中,唯有拥抱技术、深耕创意,方能在数字艺术的浪潮中立于潮头。参考文献与工具推荐技术原理:火星时代资讯《人工智能和三维建模》工具实测:哔哩哔哩《tyDiffusion 3dsMax应用》9、Tripo AI官网教育案例:原创论文《人工智能技术介入三维动画课程建设》

m0_46478534的博客 3010

JS高级-ES6之Class类与构造函数

JS高级-ES6之Class类与构造函数

jnfy的博客 1826

物理小白也能懂的PINN指南:用Python给神经网络注入‘物理常识‘

本文为物理小白提供了一份通俗易懂的PINN入门指南。通过生活化类比和Python实战,详细讲解了如何将物理定律作为约束注入神经网络,使其具备“物理常识”,从而在数据稀缺时也能做出符合规律的预测。文章以热传导方程为例,手把手教你从零构建物理信息神经网络。

open4的博客 349

ES6中类的使用

按照构造函数形式创建类,不仅仅和编写普通的函数过于相似,而且代码并不容易理解。在ES6(ECMAScript2015)新的标准中使用了class关键字来直接定义类。但是类本质上依然是前面所讲的构造函数、原型链的语法糖而已。所以学好了构造函数、原型链更有利于我们理解类的概念和继承关系。 那么如何来使用class来定义一个类呢? 可以观察一下类的特点,它也是有原型的。 类的构造方法 通过类的构造方法,可以把值传入类中。这里和构造函数有些许不同,是依靠来实现的。 类中方法的定义 类中的方法主要有普通方法,访问器方

qq_39112047的博客 1660

图解凸函数与凹函数:别再被数学定义搞晕了!

本文通过图解和生活化类比,深入浅出地解释了凸函数与凹函数的数学定义及其与日常直觉的差异。文章详细介绍了凸函数的图像特征、数学定义(包括二阶导数判断)、在机器学习中的重要性,以及常见误区和实际应用中的判断技巧,帮助读者彻底理解这一关键数学概念。

weixin_29159441的博客 654

TSP:车为什么能和云端交互?

TSP:车为什么能和云端交互?

天赐好车的博客 410

【JavaScript】ES6 中class定义类

在 ES6(ECMAScript2015)新的标准中使用了class关键字来直接定义类; 但是类本质上依然是之前所学习过的构造函数、原型链的语法糖而已。所以学好之前的构造函数、原型链更有利于我们理解类的概念和继承关系。...

qq_49002903的博客 3223

第4节:cesium 0基础发布离线地图(含源码+视频)

cesium发布离线地图

qq_29384639的博客 1597

ES6--》读懂JS中—Class类

子类继承父类的 constructor() 构造函数中必须要有 super(),代表调用父类的构造函数,没有就会报错,super虽然代表父类的构造函数,但是返回的是子类的实例,即super内部的this指的是子类的实例。方法是类的默认方法,通过 new 命令生成对象实例时,自动调用该方法,一个类必须有constructor()方法,如果没有显示定义,一个空的constructor()方法会被默认添加。:定义的类名只能在Class内部使用,指代当前类,在Class外部,类只能用自己定义等于类的常量。

ztK63LrD的博客 2263

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JavaScript ES6 Class详解

ES6 Class语法提供了更简洁和面向对象的编程方式,包括构造函数、实例方法、静态方法、getter/setter等特性。Class内部默认启用严格模式,必须使用new调用,方法不可枚举。通过extends实现继承,支持静态方法和属性(ES2022)。新增了私有属性和方法(#前缀)以及实例属性的现代定义方式。相比ES5构造函数,Class语法更清晰且功能更强大,如继承内置对象、私有成员等特性,使JavaScript面向对象编程更加完善。

qq_46032105的博客 1708

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

es6 class类与class类中constructor

序言 在es6 中的class关键字用于声明类,在此之前js一直没有类的概念,本文只要讨论class的与es5中对象的关系以及class中constructor的作用 关键字class ES6 的class可以看作只是一个语法糖,而类本身可以看作一个构造函数 class A { hello() {} } typeof A //function 首先验证类型,OK确实为函数,既然是构造函数,当然...

黑星 8538

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JavaScript ES6 class类(this关键字)总结

ES6实现了class关键词,使js模块化编程更加简洁, 下面是关于class继承的一小点总结, 详细请参照这位大神的详细介绍(点击) 具体class的原理这边就不写了, 看上面的链接即可, 这边只是个人的一点总结吧 class类的this 在JS中this关键字用的非常多, jq中的this, 原生js的this和class中的this代表的含义都不一样, 问题就出现在如果这3中情况都用在...

tonny7501的博客 4147

【ES6】JS类的用法class

【ES6】JS类的用法class一、概述二、构造函数constructor三、静态方法与静态变量 引言:由于JS之前一直没有特有的class来定义类的语法,ES6把其纳入规范。并且,由于一些JS特性,JS的class也有一些特性。 一、概述   JavaScript语言的传统方法是通过构造函数定义并生成新对象。下面是一个例子。 function Point(x,y){ ...

十一月廿七风雨大作 7206

ES6深入—ES6 Class 类

本文介绍了 ES6 Class 的 ES6 类的定义及使用的 constructor() 方法、Class 表达式和 super 关键字。

weixin_44009656的博客 862

es6 class创建类

传统创建类方法 Js语言的传统方法是通过构造函数,定义并生成新对象,prototype 属性使您有能力向对象添加属性和方法,是一种基于原型的面向对象系统。 //Person.js function Person(x,y){ this.x = x; this.y = y; this.say=function(){return y} } Person.prototyp...

Jq的博客 4173

深入浅出JS—11 ES6中类class和extends的使用

ES6中引入class语法糖来定义类,采用extends关键字来实现类的继承。相比于ES5中构造函数的方式在书写的简便性上有了质的提升。但是万变不离其宗,本文带你解密语法糖背后的实现原理,看完你会对class和extends有更深入的理解和认识

分享前端知识,记录前端进阶 4878

深入浅出ES6 Class:从基础到进阶

在ES6中,Class类的定义非常简单,使用classgreet() {${this// 输出:Hello, my name is John and I am 30 years old.// 输出:Hello, my name is John and I am 30 years old.${this// 输出:Hello, my name is John and I am 30 years old.

技小白的博客 1142

js中es6 class类的继承

js中 es6 class类的继承 语法 // 父类 class Father{ } // 子类继承父类 class Son extends Father { } 子类使用super关键字访问父类的方法 //定义了父类 class Father { constructor(x, y) { this.x = x; this.y = y; } sum...

清风的博客 1808

JS ES6 Class 类详解

Class详解 零,ES6转ES5代码 下面代码是我们使用babel转换器来实现es6转es5(如果想进行代码转换,那么可以使用官网转换器): 代码如下: //ES6 class Foo{ constructor(name){ this.name = name } show(){ console.log(this.name) } } var foo = new Foo('xz') //ES5 "use strict"; //该函数的主要作用是判断left是不是rig

qq_44999678的博客 1219

JavaScript class本质:ES6类是原型的封装而非替代

JavaScript中的class并非面向对象语言中传统意义上的类,而是基于原型(prototype)机制的一层语法封装与行为约束。其核心原理在于将构造函数、原型链操作和继承逻辑标准化,提升代码可读性、协作安全性和调试体验。技术价值体现在强制new调用、初始化顺序保障(super优先)、静态/实例成员内存隔离等工程优势。典型应用场景包括Vue/React组件状态管理、表单验证体系构建、TypeScript类型增强以及跨框架复用的业务逻辑抽象。理解class与prototipos、herencia的内在统一性

weixin_34326558的博客 507

JavaScript原型 | ES6 class 类

对prototype对象是否有很多的问号,作为一个计算机入门语言是c++和java的我,理解原型当然很容易,但是也会觉得写法麻烦,于是ES6提出了解决办法。ES6可以像c++样使用class了。用法也差不多。 比如: 创建一个person类,constructor方法就是类的构造方法。你在person类里添加的方法,都会作为这个类的原型存在。注意添加方法的时候要采用对象方法的简写方式。 子类对...

我是菜鸡 1576
上一篇: 深入浅出JavaScript中的对象继承:从原型链到ES6类
下一篇: 为什么说「组合胜过继承」是软件设计的基本原则?
coding随想
博客等级 码龄9年 2003粉丝 546原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coding随想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值