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 相关文章推荐
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
Dec 27 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
Mar 01 Javascript
JS数组合并push与concat区别分析
Dec 17 Javascript
Javascript技术栈中的四种依赖注入详解
Feb 23 Javascript
浅谈js中字符和数组一些基本算法题
Aug 15 Javascript
vue-cli+webpack记事本项目创建
Apr 01 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
Aug 17 Javascript
ES6中的Promise代码详解
Oct 09 Javascript
JS实现图片居中悬浮效果
Dec 25 Javascript
vuejs 动态添加input框的实例讲解
Aug 24 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 Javascript
vue treeselect获取当前选中项的label实例
Aug 31 Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 #Javascript
js作用域及作用域链工作引擎
Promise静态四兄弟实现示例详解
Jul 07 #Javascript
Three.js实现雪糕地球的使用示例详解
二维码条形码生成的JavaScript脚本库
Jul 07 #Javascript
JS实现简单的九宫格抽奖
JS实现九宫格拼图游戏
You might like
php自动跳转中英文页面
2008/07/29 PHP
基于pear auth实现登录验证
2010/02/26 PHP
php生成略缩图代码
2012/07/16 PHP
php-fpm配置详解
2014/02/12 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
python通过smpt发送邮件的方法
2015/04/30 Python
python字符串,数值计算
2016/10/05 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
python字符串的拼接方法总结
2019/11/18 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
儿科护理实习自我鉴定
2013/09/19 职场文书
家长评语和期望
2014/02/10 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
六五普法宣传标语
2014/10/06 职场文书
婚前协议书范本两则
2014/10/16 职场文书
父亲去世追悼词
2015/06/23 职场文书
公司开业主持词
2015/07/02 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle