详解class语法糖,有哪些基础知识要了解
Admin 2022-09-06 群英技术资讯 951 次浏览
这篇文章将为大家详细讲解有关“详解class语法糖,有哪些基础知识要了解”的知识,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。后来呢,深入了解 JavaScript 高级程序设计中的继承,包括构造函数继承、原型继承、组合继承、寄生组合继承,都有各自的缺点,有兴趣的朋友,可以看我这篇文章。
还有,本瓜特别记住:维基对 JavaScript 起源的解释
JavaScript的语言设计主要受到了Self(一种基于原型的编程语言)和Scheme(一门函数式编程语言)的影响。在语法结构上它又与C语言有很多相似。
最后,我的小结呢就是:JavaScript 本身的设计就是“通过原型委托”来实现代码复用的,结果 ES6 搞出了个 class 作为语法糖,其本身还是基于原型链,但又是为了实现面向对象,面向对象是基于 class 类那种“复制”来实现代码复用。
类 和 原型,是两种不同的东西,JS class 将二者混在了一起,别不别扭?
后来也看到一些文章说在 JS 中使用 class 类会造成一些困扰,所以更加坚定要减少使用 class 。
而实际上,本篇题目是:JS 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 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 还是非常有使用它的价值的,不用逃避,把它用在合适的场景,肯定会发现其魅力~~
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于鼠标事件以及键盘事件的相关问题,还包括了页面事件、焦点事件、表单事件,下面一起来看一下,希望对大家有帮
目录作用域全局作用域作用域中的错误局部作用域with弊端数据泄露性能下降letconst作用域链闭包闭包对作用域链的影响匿名函数的赋值使用let作用域作用域,也就是我们常说的词法作用域,说简单点就是你的程序存放变量、变量值和函数的地方。根据作用范围不同可以分为全局作用域和局部作用域,简单说来就是,花括号{}括起来的代码
本文主要给大家介绍JavaScript脚本被执行的相关内容,大家在编写JavaScript脚本时,有没有想过JavaScript脚本什么时候被执行呢?脚本执行是怎样的呢?下面我们就来了解一下这些。
用JS怎样做点击复制文本的功能?点击按钮实现复制文本的功能还是比较实用的,例如下本实现的复制邀请码的功能,此外点击复制文本的应用场景还有很多。感兴趣的朋友可以参考下文实例,接下来我们就一起来了解看看。
jquery判断当前元素是第几个的方法:1、创建一个HTML示例文件;2、通过jQuery代码“$("ul li").click(function () {var index = $("ul li").index...})”进行判断即可。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008