Предотвратить уязвимости и повысить удобочитаемость.
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 } }
Полученный объект точно такой же.
Это можно сделать в любое время, когда имя свойства объекта совпадает с именем переменной, которой мы хотим его присвоить.
Намного чище, вы не согласны?
Заключительные слова
Спасибо за прочтение. 🙏
Надеюсь, вы нашли эту статью интересной и, возможно, узнали что-то новое.