Предотвратить уязвимости и повысить удобочитаемость.

1. Не вызывайте методы Object.prototype напрямую.

Почти все объекты в JavaScript являются экземплярами Object и поэтому наследуют методы от Object.prototype.

Некоторые примеры этих методов: hasOwnProperty, propertyIsEnumerable и isPrototypeOf.

Есть ряд тонких ошибок, которые могут возникнуть, когда вы вызываете эти методы непосредственно на объекте.

Нулевой объект

Можно создать нулевой объект, который не наследуется от Object.prototype, с помощью следующего конструктора.

const obj = Object.create(null)

Обычно это делается, когда мы хотим использовать объект исключительно как карту.

Вызов Object.prototype метода на obj приведет к сбою нашей программы.

obj.hasOwnProperty("name")
//Uncaught TypeError: obj.hasOwnProperty is not a function

Перезапись методов (затенение)

Объект может перезаписать методы из Object.prototype. Это открывает возможность возникновения уязвимостей типа «отказ в обслуживании».

Представьте, что у нас есть веб-сервер, который анализирует ввод JSON от клиента, а затем напрямую вызывает hasOwnProperty для объекта. Злоумышленник может вывести из строя наш сервер, отправив что-то вроде {"hasOwnProperty: 50"}.

Исправление

Чтобы избежать этих ошибок, всегда рекомендуется вызывать методы из Object.prototype.

Object.prototype.hasOwnProperty(obj,"name")

Я нашел этот совет особенно интересным во время исследования для этой статьи.

2. Объекты с динамическими именами свойств

Предположим, мы хотим создать объект с именем свойства, которое изменяется в зависимости от некоторой функции.

Представим, что это наша функция.

function getName(x) {
  return `${x} is the name`
}

Один из способов сделать это - создать объект, а затем добавить динамическое свойство.

const myObj= {
  id:10, 
  location: 'UK'
}
myObj[getName('something')] = true

Конечно, это совершенно правильный JavaScript.

Однако мы можем определить имя свойства во время объявления объекта.

const myObj= {
  id:10, 
  location: 'UK'
  [getName('something')] = true
}

Это делает наш код немного чище, сохраняя все свойства в одном месте.

3. Сокращение стоимости собственности

Предположим, у нас есть функция, которая создает объект на основе переменных, которые передаются в функцию.

До ES6 вы объявляли такой объект именно так.

function createObj(name,height,weight){
  const myObj = {
    name: name,
    height: height,
    weight: weight
  }
}

Сокращение значений свойств позволяет нам сократить наш код до следующего.

function createObj(name,height,weight){
  const myObj = {
    name,
    height,
    weight
  }
}

Полученный объект точно такой же.

Это можно сделать в любое время, когда имя свойства объекта совпадает с именем переменной, которой мы хотим его присвоить.

Намного чище, вы не согласны?

Заключительные слова

Спасибо за прочтение. 🙏

Надеюсь, вы нашли эту статью интересной и, возможно, узнали что-то новое.