При динамическом определении в объекте новых свойств и методов перед их использованием бывает важно проверить, а есть ли уже такие методы и свойства. Для этого в javascript может использоваться оператор in. Он имеет следующий синтаксис:
"свойство|метод" in объект
в кавычках идет название свойства или метода, а после in - название объекта.
Если свойство или метод с подобным именем имеется, то оператор возвращает true
. Если нет - то возвращается false
.
Например, узнаем, есть ли в объекте ряд свойств:
const user = {}; user.name = "Tom"; user.age = 26; user.print = function(){ console.log(this.name); console.log(this.age); }; const hasNameProp = "name" in user; console.log(hasNameProp); // true - свойство name есть в user const hasWeightProp = "weight" in user; console.log(hasWeightProp); // false - в user нет свойства или метода под названием weight
С помощью выражения "name" in user
проверяем, есть ли в объекте user свойство "name" и результат проверки передаем в константу hasNameProp.
Далее анологичным образом проверяем наличие свойства wheight
.
Подобным образом можно проверить и наличие методов:
const hasPrintMethod = "print" in user; console.log(hasPrintMethod); // true - в user есть метод print
Альтернативный способ заключается в проверке на значение undefined. Если свойство или метод равен undefined, то эти свойство или метод не определены:
const hasNameProp = user.name!==undefined; console.log(hasNameProp); // true const hasWeightProp = user.weight!==undefined; console.log(hasWeightProp); // false
И так как объекты представляют тип Object, а значит, имеет все его методы и свойства, то объекты также могут использовать метод hasOwnProperty(), который определен в типе Object:
const hasNameProp = user.hasOwnProperty("name"); console.log(hasNameProp); // true const hasPrintMethod = user.hasOwnProperty("print"); console.log(hasPrintMethod); // true const hasWeightProp = user.hasOwnProperty("weight"); console.log(hasWeightProp); // false
С помощью цикла for мы можем перебрать объект как обычный массив и получить все его свойства и методы и их значения:
const tom = { name: "Tom", age: 26, print(){ console.log(`Name: ${this.name} Age: ${this.age}`); } }; for(const prop in tom) { console.log(prop, " : ", tom[prop]); }
И при запуске консоль браузера отобразит следующий вывод:
name : Tom age : 26 print : print(){ console.log(`Name: ${this.name} Age: ${this.age}`); }
С помощью дополнительных функций Object.entries, Object.keys и Object,values можно получить все свойства (в том числе методы) объекта и их значения.
Функция Object.entries() в качестве параметра принимает объект и возвращает массив пар "название_свойства - значение", где каждая пара свойство-значение представляет массив. Например:
const tom = { name: "Tom", age: 26, print(){ console.log(`Name: ${this.name} Age: ${this.age}`); } }; for(const prop of Object.entries(tom)) { console.log(prop); }
Консольный вывод:
["name", "Tom"] ["age", 26] ["print", ƒ]
Функция Object.keys() позволяет получить массив названий всех свойств объекта. Например, возьмем выше определенный объект tom
:
const tom = { name: "Tom", age: 26, print(){ console.log(`Name: ${this.name} Age: ${this.age}`); } }; console.log(Object.keys(tom)); // ["name", "age", "print"]
Соответственно можно перебрать этот набор и получить значения свойств:
for(const prop of Object.keys(tom)) { const value = tom[prop]; // получаем по названию значение свойства console.log(prop,value); }
Консольный вывод:
name Tom age 26 print ƒ print(){ console.log(`Name: ${this.name} Age: ${this.age}`); }
Функция Object.values() возвращает массив, который содержит все значения свойств объекта:
const tom = { name: "Tom", age: 26, print(){ console.log(`Name: ${this.name} Age: ${this.age}`); } }; console.log(Object.values(tom)); // ["Tom", 26, print()]