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 相关文章推荐
JavaScript控制Session操作方法
Jan 17 Javascript
jquery制作搜狐快站页面效果示例分享
Feb 21 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
Jul 30 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
Sep 16 Javascript
jQuery页面刷新(局部、全部)问题分析
Jan 09 Javascript
浅谈JS中String()与 .toString()的区别
Oct 20 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
Jun 26 Javascript
Javascript(es2016) import和require用法和区别详解
Aug 11 Javascript
微信小程序中setInterval的使用方法
Sep 29 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
Mar 16 Javascript
微信小程序位置授权处理方法
Jun 13 Javascript
React-redux实现小案例(todolist)的过程
Sep 29 Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 #Javascript
js作用域及作用域链工作引擎
Promise静态四兄弟实现示例详解
Jul 07 #Javascript
Three.js实现雪糕地球的使用示例详解
二维码条形码生成的JavaScript脚本库
Jul 07 #Javascript
JS实现简单的九宫格抽奖
JS实现九宫格拼图游戏
You might like
IIS6的PHP最佳配置方法
2007/03/19 PHP
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
深入理解Promise.all
2018/08/08 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
压缩包密码破解示例分享(类似典破解)
2014/01/17 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
Python延时操作实现方法示例
2018/08/14 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
Python字符串的修改方法实例
2019/12/19 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
采购内勤岗位职责
2013/12/10 职场文书
签约仪式策划方案
2014/06/02 职场文书
校园广播稿精选
2014/10/01 职场文书
2014年护理部工作总结
2014/11/14 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
python多线程方法详解
2022/01/18 Python
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python