John Au-Yeung
来源:medium
译者:前端小智
点赞再看,养成习惯
本文
GitHub
https://github.com/qq44924588… 上已经收录,更多往期高赞文章的分类,也整理了很多我的文档,和教程资料。欢迎 Star 和完善,大家面试可以参照考点复习,希望我们一起有点东西。
JavaScript 是一种易于学习的编程语言,编写运行并执行某些操作的程序很容易。然而,要编写一段干净的 JavaScript 代码是很困难的。
在本文中,我们将介绍一些优化 JS 类和对象的重构思路。
用常量来表示数字
如果我们有很多重复的值且表示一样的含义,但没有明确地说明,那么我们应该将它们转换为常量,以便每个人都知道它们的含义,并且如果需要更改,我们只需更改一个地方就行了。
例如我们可能会这样写代码:
const getWeight = (mass) => mass * 9.81
const potentialEnergy = (mass, height) => mass * height * 9.81
对于含义相同的数学我可以用常量表示:
const GRAVITATIONAL_CONSTANT = 9.81;
const getWeight = (mass) => mass * GRAVITATIONAL_CONSTANT
const potentialEnergy = (mass, height) => mass * height * GRAVITATIONAL_CONSTANT
现在我们知道9.8
1 实际上意味着 GRAVITATIONAL_CONSTANT,我们不必重复自己。
上面我们用常量 GRAVITATIONAL_CONSTANT
表示 9.81
,这样别人一看就知道它表示是万有引力常数常量。
封装字段
我们可以将 getter
和setter
添加到类的字段中,这样就不心直接对类的字段进行操作。
例如我们可能会这样写代码:
class Person {constructor(name) {this.name = name;}
}
如果要控制如何设置值,可以这样重构:
class Person {constructor(name) {this._name = name}
get name() {return this._name}
set name() {this._name = name}
}
这样,我们就可以控制如何设置值,因为我们可以在 setter
中放入代码来设置名称。我们还可以控制谁能获得名称,因为它是在 getter
中返回的。
用数组类代替字段
我们可以将字段替换为其自己的数据类,这样在记录数据中会有更强灵活性。
例如我们可能会这样写代码:
class Person {constructor(name, bloodGroup) {
this.name = name;
this.bloodGroup = bloodGroup;
}
}
const person = new Person('joe', 'a')
如果我们想扩充 bloodGroup
(血型)的种类,我们可以把 bloodGroup
重构成一个类。
class BloodGroup {constructor(name) {this.bloodGroup = name;}
}
class Person {constructor(name, bloodGroup) {
this.name = name;
this.bloodGroup = bloodGroup;
}
}
const bloodGroup = new BloodGroup('a');
const person = new Person('joe', bloodGroup)
这样,我们就可以在 bloodGroup
字段中存储更多种类的数据。
用状态 / 策略替换类型代码
有时,我们可以根据对象的类型创建子类,而不是在类中使用类型字段。这样,我们就可以在它们自己的子类中拥有两个类不共享的更多成员。
例如我们可能会这样写代码:
class Animal {constructor (type) {this.type = type}
}
const cat = new Animal('cat')
const dog = new Animal('dog')
我们可以根据 type
类型来重构对应的类:
class Animal {//...}
class Cat extends Animal {//...}
class Dog extends Animal {//...}
const cat = new Cat();
const dog = new Dog();
在上面的示例中,我们单独编写一个 Animal
类,而另外添加 Cat
和Dog
类,它们是 Animal
类的子类。
这样我们可以 Cat
和 Dog
类中共享的属性保存在各自的类的,把共享的放在 Animal
类中。
分解条件表达式
我们可以将长的条件表达式分解为更小的条件表达式。
例如我们可能会这样写代码:
let ieIEMac = navigator.userAgent.toLowerCase().includes("mac") && navigator.userAgent.toLowerCase().includes("ie")
我们可以这样重构它:
let userAgent = navigator.userAgent.toLowerCase();
let isMac = userAgent.includes("mac");
let isIE = userAgent.toLowerCase().includes("ie");
let isMacIE = isMac && isIE;
我们将冗长又难懂的条件表达式分解多个短小表达式,这样会大大滴增加阅读性。
总结
如果我们有很多重复的值且表示一样的含义,但没有明确地说明,那么我们应该将它们转换为常量,以便每个人都知道它们的含义,并且如果需要更改,我们只需更改一个地方就行了。
为了更好控制类的属性,我们可以为它添加 getter
和setter
方法。
如果我们有 type
字段,则可以用它们自己的子类替换它们。
最后,我们可以将长条件表达式分解为较小的条件表达式,以便于阅读和理解。
代码部署后可能存在的 BUG 没法实时知道,事后为了解决这些 BUG,花了大量的时间进行 log 调试,这边顺便给大家推荐一个好用的 BUG 监控工具 Fundebug。
https://levelup.gitconnected….
交流
文章每周持续更新,可以微信搜索「大迁世界」第一时间阅读和催更(比博客早一到两篇哟),本文 GitHub https://github.com/qq449245884/xiaozhi 已经收录,整理了很多我的文档,欢迎 Star 和完善,大家面试可以参照考点复习,另外关注公众号,后台回复 福利,即可看到福利,你懂的。