JavaScript重构技巧_对象和值

更新日期: 2020-04-10 阅读: 2.2k 标签: 对象

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.81实际上意味着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字段,则可以用它们自己的子类替换它们。

最后,我们可以将长条件表达式分解为较小的条件表达式,以便于阅读和理解。


原文:https://levelup.gitconnected.com/javascript-refactoring-objects-and-values-ea1aa7371360
译者:前端小智  

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/9278

相关推荐

js获取object对象的长度

我们都知道必须是具体数据类型才有长度,所以size和length都无法测量object对象的长度,那么如何计算对象的长度,即获取对象属性的个数呢?

JavaScript数组、对象合并的多种方法实现

这篇文章讲解Js数组和对象的一些使用技巧,如何将不同的数组,对象合并/结合为1个的方法

js中关于for...in遍历对象属性的顺序问题

对象使用obj.length时,它得到的值是undefined的,所以只能通过for...in循环获取对象的属性,我们发现并没有按属性的顺序显示,而且顺序在各个浏览器下显示也不同。 这是为什么呢?

JavaScript 判断对象中是否有某属性

判断对象中是否有某属性的常见方式总结,不同的场景要使用不同的方式。一点( . )或者方括号( [ ] )、二in 运算符、三hasOwnProperty()。三种方式各有优缺点,不同的场景使用不同的方式,有时还需要结合使用

JS 的 Document对象

Document 对象是是window对象的一个属性,因此可以将document对象作为一个全局对象来访问。当浏览器载入 HTML 文档, 它就会成为 Document 对象。Document对象的 属性和方法

Js通过.或者[]访问对象属性的语法、性能等区别

在JavaScript中可以使用 . 或者 [ ] 来访问对象的属性,但是对象中方法只能通过 . 来获取;使用.运算符来存取对象的属性的值。或者使用[]作为一个关联数组来存取对象的属性。但是这两种方式有什么区别了?

history对象详解及单页面路由实现

history对象保存着用户的上网记录,从浏览器窗口打开的那一刻算起。出于安全的考虑,开发人员无法得知用户浏览过的URL。不过,借由用户访问过的页面列表,同样可以在不知道实际URL的情况下实现后退与前进

js对象 对属性调用.和[] 两种方式的区别

在 JS 对象中,调用属性一般有两种方法——点和中括号的方法。 标准格式是对象.属性(不带双引号),注意一点的是:js对象的属性,key标准是不用加引号的,加也可以,特别的情况必须加,如果key数字啊,表达式啊等等

javascript中document是什么?

javascript中document是window对象的属性,表示对Document对象的只读引用。Document对象是Window对象的一部分,可通过window.document属性对其进行访问。

Js中Blob是什么?

MDN给出的解释:Blob 对象表示一个不可变、原始数据的类文件对象;创建一个blob只有两种方式1、通过new Blob();使用blob.slice切割,创建一个新的blob对象;读取blob唯一方式,使用fileReader

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!