Перегрузите свои собственные объекты JavaScript для лучшего повторного использования и более чистого кода.
Проблемное пространство
С момента появления ES6 появилось множество новых методов JavaScript, таких как map, reduce, find. Все они являются функциональными помощниками для вашего кода, чтобы упростить вам манипулирование структурами данных Javascript и работу с ними.
В нашей повседневной жизни как разработчики JavaScript мы по-прежнему пишем одно и то же снова и снова, и именно здесь в игру вступают такие библиотеки, как Lodash. Но действительно ли все это необходимо, когда люди спорят о том, почему размер пакета React составляет 145 КБ, а Angular - 2,4 МБ? Ничего особенного в Lodash, впечатляющей библиотеке.
Мое решение
Доступен вариант расширения объектов JavaScript тем, что мы уже знаем. ES6 также был представлен с классами, которые являются просто синтаксическим сахаром, но исходящие из фона ООП, улучшают ваше понимание, хотя в JavaScript все еще есть много причуд.
В моей повседневной работе мне часто нужно найти уникальное вхождение элемента в массив. Мне нужно проверить, существует ли элемент в массиве или нет, что, как мне кажется, является частью обычного рабочего процесса, ничего нестандартного.
class PowerArray extends Array { checkIfExist(value){ return !!this.find(val=>val==value) } unique(){ console.log(this) return new PowerArray(...new Set(this)) } sum(){ return this.reduce((val,acc)=>val+acc,0) } } const array=new PowerArray()
В этой реализации у вас есть все функции, которые изначально предоставляются массивом, а также добавлены 3 различных метода.
Теперь мы можем использовать этот новый массив как обычный массив и связать наши методы вместе с собственными методами.
array.push(1) array.push(2) array.push(2) console.log(array.unique().sum())//3 console.log(array.sum())//5 console.log(array.checkIfExist(7))//false
Переходим к другой важной структуре данных, которая часто используется в мире JavaScript - объектам.
class PowerObject extends Object{ getKeys(){ return Object.keys(this) } getValues(){ return Object.values(this) } prettyPrint(){ console.group('Object...') console.log('Object Values',this) console.groupEnd() } deepClone(){ const temp=JSON.stringify(this); return Object.assign(new PowerObject(),JSON.parse(temp)) } }
Мы использовали ту же концепцию и здесь, и с помощью этого кода мы можем добавить к нашему приложению еще 3 полезных метода.
Для клонирования объекта мы часто используем оператор распространения
const a = {...b}//works only with first level keys, shallow copy
Эта реализация отлично работает до тех пор, пока у вас нет вложенных объектов в b, и многие новички изо всех сил пытаются найти проблемы, когда они ожидают, что это будет работать и с вложенными объектами.
const myObject = new PowerObject(); myObject['a']=5; myObject['b']={'m':'5'}; const normalObject={...myObject} normalObject.a=7; normalObject.b.m=6; console.log(myObject) //a: 5 , b:{m:6} so the value of m is changed despite using the //spread operator
Исправление:
Как это работает? Когда вы конвертируете объект в строку и анализируете ее обратно в объект, он прерывает ссылку на исходный объект, преобразовывая его в примитивные типы, которые передаются по значению и являются неизменяемыми, в отличие от объектов, которые передаются по ссылке.
const normalObject = myObject.deepClone()//this will make a deep copy console.log(normalObject) normalObject.a = 7 normalObject.b.m = 6 myObject.prettyPrint()// the original object intact //YEAHHH
Теперь другие методы также являются более синтаксическим сахаром, чтобы сделать вашу работу чище и более читабельным кодом.
myObject.getKeys() //["a", "b"] myObject.getValues() //[5, {…}]
Итак, мы подошли к концу статьи. Ключевые выводы? Всегда старайтесь упростить кодовую базу для себя и своих коллег; Излишняя инженерия - это реальная вещь в программировании, поэтому постарайтесь ее избегать. Вы можете укрепить свое понимание, создав свои собственные методы и сделав свой код максимально развязанным.
Совет:
Вы можете добавить этот класс к объекту окна в вашем входном файле или любом из файлов сценария, чтобы они были доступны во всем проекте без необходимости импортировать его повсюду.
window.PowerClass=PowerClass
Избегайте использования тех же имен функций или методов, которые доступны в собственном JavaScript. Это может причинить вам больше вреда, чем пользы.
Следите за новостями. Мир!
Больше контента на plainenglish.io