© IGP, декабрь 2024 г.
Объекты обычно создаются, чтобы представлять сущности реального мира
// Объект пользователя
let user = {
name: "Лоханкин",
age: 30
};
Так же, как и в реальном мире, пользователь может совершать действия.
Такие действия в JavaScript представлены функциями в свойствах, которые называются методами.
let user = {
name: "Лоханкин",
age: 30,
sayHi: function() {
consile.log("Привет!");
}
};
Вызов метода:
user.sayHi(); // Привет!
Свойству с именем sayHi присваивается заранее созданная функция
// Объект пользователя
let user = {
name: "Лоханкин",
age: 30
};
function sayHi() {
alert("Привет!");
}
// добавляем в качестве метода
user.sayHi = sayHi;
Вызов метода:
user.sayHi(); // Привет!
// эти объекты делают одно и то же
user = {
sayHi: function() {
console.log("Привет");
}
};
// сокращённая запись выглядит лучше
user = {
sayHi() { // то же самое, что и "sayHi: function(){...}"
console.log("Привет");
}
};
Эти две записи не полностью эквивалентны. Есть тонкие различия.
this - означает "текущий объект"
let user = {
name: "Иннокентий",
age: 30,
sayHi() {
console.log(this.name);
}
};
user.sayHi(); // Иннокентий
let user = { name: "Пётр" };
let admin = { name: "Admin" };
function sayHi() {
console.log( this.name );
}
user.f = sayHi;
admin.f = sayHi;
user.f(); // Пётр (this == user)
admin.f(); // Admin (this == admin)
admin['f'](); // Admin
let user = {
name: "Василий",
age: 30,
sayHi: () => {
console.log("Привет!");
}
};
user.sayHi(); // Привет!
Стрелочные функции не имеют «собственного» this
let calc = {
x: 0
y: 0
sum: function (a,b){
return a+b;
}
};
console.log(calc.sum(33, 66)); // 99
У объекта может быть два типа свойств
let obj = {
get propName() {
// геттер, срабатывает при чтении obj.propName
},
set propName(value) {
// сеттер, срабатывает при записи obj.propName = value
}
};
let user = {
name: "Остап",
surname: "Бендер",
get fullName() {
return `${this.name} ${this.surname}`;
}
};
console.log(user.fullName); // Остап Бендер
let user = {
name: "Паниковский",
surname: "Михаил",
get fullName() {
return `${this.name} ${this.surname}`;
},
set fullName(value) {
[this.name, this.surname] = value.split(" ");
}
};
user.fullName = "Балаганов Шура";
console.log(user.name); // Балаганов
console.log(user.surname); // Шура
Cвойство объекта может быть либо свойством-аксессором (с методами get/set), либо свойством-данных
let user = {
name: "Александр",
surname: "Корейко"
};
Object.defineProperty(user, 'fullName', {
get() {
return `${this.name} ${this.surname}`;
},
set(value) {
[this.name, this.surname] = value.split(" ");
}
});
console.log(user.fullName); // Александр Корейко
for(let key in user) console.log(key); // name, surname
function User(name, birthday) {
this.name = name;
this.birthday = birthday;
}
let u = new User("Райкер", new Date(1966, 10, 03));
console.log(u.birthday); // 03.10.1966
console.log(u.name); // Райкер