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  Error 对象 错误处理
May 18 Javascript
js 数组克隆方法 小结
Mar 20 Javascript
基于jquery的tab切换 js原理
Apr 01 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
Jun 20 Javascript
node.js中的url.parse方法使用说明
Dec 10 Javascript
js实现点击文本框显示日期选择器特效代码分享
May 21 Javascript
深入理解js函数的作用域与this指向
May 28 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
Jun 13 Javascript
BootStrap select2 动态改变值的方法
Feb 10 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
Dec 20 Javascript
JS实现快递单打印功能【推荐】
Jun 21 Javascript
优雅的使用javascript递归画一棵结构树示例代码
Sep 22 Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 #Javascript
js作用域及作用域链工作引擎
Promise静态四兄弟实现示例详解
Jul 07 #Javascript
Three.js实现雪糕地球的使用示例详解
二维码条形码生成的JavaScript脚本库
Jul 07 #Javascript
JS实现简单的九宫格抽奖
JS实现九宫格拼图游戏
You might like
动易数据转成dedecms的php程序
2007/04/07 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php伪静态之APACHE篇
2014/06/02 PHP
PHP实现自动登入google play下载app report的方法
2014/09/23 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
Javascript es7中比较实用的两个方法示例
2017/07/21 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
Python导出DBF文件到Excel的方法
2015/07/25 Python
python黑魔法之编码转换
2016/01/25 Python
有趣的python小程序分享
2017/12/05 Python
Python 复平面绘图实例
2019/11/21 Python
Pytorch的mean和std调查实例
2020/01/02 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
HashMap和Hashtable的区别
2013/05/18 面试题
导游词之岳阳楼
2019/09/25 职场文书
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android