JS class语法糖的深入剖析


Posted in Javascript onJuly 07, 2022

引言

在很早以前,写过一篇文章 “类”设计模式和“原型”设计模式——“复制”和“委托”的差异 ,大致意思就是说:代码复用,也就是继承、重写,有两种思路:1. 面向对象的类继承;2. 基于 JavaScript 原型链的原型继承;前者的主要特点是:复制,通俗来说就是把变量、属性再复制一份,后者的主要特点是:委托,通过属性的查找来实现的。

后来呢,深入了解 JavaScript 高级程序设计中的继承,包括构造函数继承、原型继承、组合继承、寄生组合继承,都有各自的缺点,有兴趣的朋友,可以看我这篇文章。

还有,本瓜特别记住:维基对 JavaScript 起源的解释

JavaScript的语言设计主要受到了Self(一种基于原型的编程语言)和Scheme(一门函数式编程语言)的影响。在语法结构上它又与C语言有很多相似。

最后,我的小结呢就是:JavaScript 本身的设计就是“通过原型委托”来实现代码复用的,结果 ES6 搞出了个 class 作为语法糖,其本身还是基于原型链,但又是为了实现面向对象,面向对象是基于 class 类那种“复制”来实现代码复用。

类 和 原型,是两种不同的东西,JS class 将二者混在了一起,别不别扭?

后来也看到一些文章说在 JS 中使用 class 类会造成一些困扰,所以更加坚定要减少使用 class 。

而实际上,本篇题目是:JS class 并不只是简单的语法糖,所以,本篇并不是为了说它不好,而是要说它的好的!

来吧,展翅!

class 第一个好:私有变量

如果不用 class , 还有什么更优雅的方法实现以下子类的私有变量吗?

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  } // Person.constructor
  get FullName () {
    return this.firstName + " " + this.lastName;
  }
} // Person
class Employee extends Person {
  #salary;
  constructor(firstName, lastName, salary) {
    super(firstName, lastName);
    this.salary = salary;
  }
  get salary() {
    return this.#salary;
  }
  set salary(salary) {
    this.#salary = salary;
    console.log("Salary changed for " + this.fullName + " : $" + this.salary);
  }
} // Employee

设想下,我们用原型链的思路模拟(对象):

const Person = {
  set givenName(givenName) {
    this._givenName = givenName;
  },
  set familyName(familyName) {
    this._familyName = familyName;
  },
  get fullName() {
    return `${this._givenName} ${this._familyName}`;
  }
};
const test = Person; // 这里假设用 对象 模拟 类
test.givenName = "Joe";
test.familyName = "Martinez";
console.log("test.fullName", test.fullName); // Joe Martinez
console.log("test.givenName", test.givenName); // undefined
console.log("test._givenName", test._givenName); // Joe

没有实现私有属性 _givenName

而 class 可以将值存为私有,使得对象外部不能修改:

class 第二个好:super 继承

class 可以通过 super 更优雅的实现继承、和重写,比如:

class Cash {
  constructor() {
    this.total = 0;
  }
  add(amount) {
    this.total += amount;
    if (this.total < 0) this.total = 0;
  }
} // Cash
class Nickles extends Cash {
  add(amount) {
    super.add(amount * 5);
  }
} // Nickles

如果是按照老样子,原型链,它可能是这样的:

const Cash = function() {
  this.total = 0;
}; // Cash
Cash.prototype = {
  add : function(amount) {
    this.total += amount;
    if (this.total < 0) this.total = 0;
  }
}; // Cash.prototype
const Nickles = function() {
  Object.assign(this, new Cash());
  this.add = function(amount) {
    Cash.add.apply(this, amount);
  };
} // Nickles

读起来有点乱,this 指来指去,还有在构造函数中手动做的 assign 操作,这会增加代码执行耗时。

综上两点,JS class 还是非常有使用它的价值的,不用逃避,把它用在合适的场景,肯定会发现其魅力~~

以上就是JS class语法糖的深入剖析的详细内容,更多关于JS class语法糖的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
最近项目写了一些js,水平有待提高
Jan 31 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
Oct 27 Javascript
jQuery对html元素取值与赋值的方法
Nov 20 Javascript
jquery ajaxSubmit 异步提交的简单实现
Feb 28 Javascript
node.js使用nodemailer发送邮件实例
Mar 10 Javascript
js中用window.open()打开多个窗口的name问题
Mar 13 Javascript
ExtJS4 动态生成的grid导出为excel示例
May 02 Javascript
js用拖动滑块来控制图片大小的方法
Feb 27 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
May 04 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
Feb 13 jQuery
详解基于webpack&amp;gettext的前端多语言方案
Jan 29 Javascript
详解Nuxt内导航栏的两种实现方式
Apr 16 Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 #Javascript
js作用域及作用域链工作引擎
Promise静态四兄弟实现示例详解
Jul 07 #Javascript
Three.js实现雪糕地球的使用示例详解
二维码条形码生成的JavaScript脚本库
Jul 07 #Javascript
JS实现简单的九宫格抽奖
JS实现九宫格拼图游戏
You might like
php快递单号查询接口使用示例
2014/05/05 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
React实现todolist功能
2020/12/28 Javascript
Python脚本完成post接口测试的实例
2018/12/17 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
Python数学形态学实例分析
2019/09/06 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
大专生的学习自我评价
2013/12/04 职场文书
财经学院自荐信范文
2014/02/02 职场文书
善意的谎言事例
2014/02/15 职场文书
教师读书活动总结
2014/05/07 职场文书
广播体操比赛口号
2014/06/10 职场文书
演讲比赛策划方案
2014/06/11 职场文书
环境日宣传活动总结
2014/07/09 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
培训通知
2015/04/17 职场文书
2016小学新学期寄语
2015/12/04 职场文书
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB
图文详解matlab原始处理图像几何变换
2021/07/09 Python