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加ASP二级域名转向的代码
May 17 Javascript
JavaScript 序列化对象实现代码
Dec 18 Javascript
Javascript将string类型转换int类型
Dec 09 Javascript
javascript学习笔记(八) js内置对象
Jun 19 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
Dec 29 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
Jul 31 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
Sep 25 Javascript
js+cookies实现悬浮购物车的方法
May 25 Javascript
原生JS与jQuery编写简单选项卡
Oct 30 jQuery
vue表单数据交互提交演示教程
Nov 13 Javascript
jQuery开发仿QQ版音乐播放器
Jul 10 jQuery
jQuery实现日历效果
Sep 11 jQuery
MutationObserver在页面水印实现起到的作用详解
Jul 07 #Javascript
js作用域及作用域链工作引擎
Promise静态四兄弟实现示例详解
Jul 07 #Javascript
Three.js实现雪糕地球的使用示例详解
二维码条形码生成的JavaScript脚本库
Jul 07 #Javascript
JS实现简单的九宫格抽奖
JS实现九宫格拼图游戏
You might like
用在PHP里的JS打印函数
2006/10/09 PHP
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
flash用php连接数据库的代码
2011/04/21 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
php常用数组函数实例小结
2016/12/29 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
js异或加解密效果代码
2008/06/25 Javascript
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
requireJS使用指南
2016/04/27 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
JS实现滑动门效果的方法详解
2016/12/19 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
CSS3教程:background-clip和background-origin
2008/10/17 HTML / CSS
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
大学生村官典型材料
2014/01/12 职场文书
职工趣味运动会方案
2014/02/10 职场文书
人事专员工作职责
2014/02/22 职场文书
个人租房协议书范本
2014/09/30 职场文书
投标承诺函格式
2015/01/21 职场文书
撤诉状格式范本
2015/05/19 职场文书
心灵捕手观后感
2015/06/02 职场文书
好员工观后感
2015/06/17 职场文书
2015年社区消防安全工作总结
2015/10/14 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android