Геттеры и сеттеры - это методы, позволяющие изменять/получать значение
полей класса из других объектов. Т.е. что бы напрямую не обращаться к
полю, (не делая его public) используются геттеры и сеттеры. В них же
можно валидировать данные.
// get и set заменят нам обычное свойство age
/* var person = {
name: "Sorax",
get age(){
console.log("Hello from getter!");
}, // get вызывается при обращении к свойству
set age(value){} // set вызывается при изменении свойства
};
person.age; // Hello from getter! */
// get и set заменят нам обычное свойство age
/* var person = {
name: "Sorax",
_age: 20,
get age(){
return this._age;
},
set age(value){
this._age = value;
}
};
console.log(person.age); // 20 */
var person = {
name: "Sorax",
_age: 20,
get age(){
return this._age;
},
set age(value){
this._age = value < 0 ? 0 : value > 122 ? 122 : value;
}
};
// Посмотрим как будет работать сеттер
person.age = 180;
console.log(person.age); // 122
person.age = -80;
console.log(person.age); // 0
person.age = 34;
console.log(person.age); // 34
/*
Обычные свойства имеют имя и значение.
Кроме этого каждое свойство имеет также атрибуты: writable, enumerable, configurable
Эти 3 атрибута можно изменять при помощи объекта, который называется дескриптором свойства - getOwnPropertyDescriptor
///
writable – значение свойства можно менять, если true. По умолчанию false.
configurable – если true, то свойство можно удалять, а также менять его в дальнейшем при помощи новых вызовов defineProperty.
По умолчанию false.
enumerable – если true, то свойство просматривается в цикле for..in и методе Object.keys(). По умолчанию false.
*/
console.log(Object.getOwnPropertyDescriptor(person, "name")); // Object { value: "Sorax", writable: true, enumerable: true, configurable: true }
console.log(Object.getOwnPropertyDescriptor(person, "age")); // Object { get: get age(), set: set age(), enumerable: true, configurable: true }
// Для определения или переопределения свойств мы можем использовать статический метод defineProperty
Object.defineProperty(person, "gender", {
value: "male",
writable: false,
enumerable: false,
configurable: false
});
console.log(person.gender); // male
// поскольку мы поставили writable: false, то мы не сможем изменить это свойство
person.gender = "female";
console.log(person.gender); // male
// ЦИКЛ FOR IN
for (property in person) {
console.log(property); // name _age age Здесь все перечисляемые свойства объекта, в т.ч наследованные
// свойство gender не выводится, т.к в его дескрипторе enumerable: false
}
// Статический метод keys возвращает массив всех полей, т.е названий только перечисляемых свойств
console.log(Object.keys(person)); // Array [ "name", "_age", "age" ]
console.log(person.propertyIsEnumerable("gender")); // false
// У нас есть метод определения свойств. Он принимает 2 параметра вместо 3
var o = {};
Object.defineProperties(o, {
x: {
value: 10,
writable: false
},
y: {
value: 20,
writable: false
},
r: {
get: function() {
return Math.sqrt(this.x * this.x + this.y * this.y);
}
}
});
console.log(o.r); // 22.360679774997898
// РАСШИРЯЕМОСТЬ ОБЪЕКТОВ - ВОЗМОЖНОСТЬ ДОБАВЛЕНИЯ НОВЫХ СВОЙСТВ
var obj = {};
console.log(Object.isExtensible(obj)); // true
var obj = {};
Object.preventExtensions(obj);
console.log(Object.isExtensible(obj)); // false
// проверим можем ли добавлять свйства к этому объекту
obj.x = 2323;
console.log(obj.x); // undefined
Object.seal(obj);
console.log(Object.isSealed(obj)); // true
/*
Метод Object.seal() запечатывает объект, предотвращая добавление новых свойств к объекту и делая все
существующие свойства не настраиваемыми.
Значения представленных свойств всё ещё могут изменяться, поскольку они остаются записываемыми.
*/
Object.freeze(obj);
console.log(Object.isFrozen(obj)); // true
/*
Метод Object.freeze() замораживает объект: это значит, что он предотвращает добавление новых свойств к объекту,
удаление старых свойств из объекта и изменение существующих свойств или значения их атрибутов перечисляемости,
настраиваемости и записываемости.
В сущности, объект становится эффективно неизменным. Метод возвращает замороженный объект.
*/
// get и set заменят нам обычное свойство age
/* var person = {
name: "Sorax",
get age(){
console.log("Hello from getter!");
}, // get вызывается при обращении к свойству
set age(value){} // set вызывается при изменении свойства
};
person.age; // Hello from getter! */
// get и set заменят нам обычное свойство age
/* var person = {
name: "Sorax",
_age: 20,
get age(){
return this._age;
},
set age(value){
this._age = value;
}
};
console.log(person.age); // 20 */
var person = {
name: "Sorax",
_age: 20,
get age(){
return this._age;
},
set age(value){
this._age = value < 0 ? 0 : value > 122 ? 122 : value;
}
};
// Посмотрим как будет работать сеттер
person.age = 180;
console.log(person.age); // 122
person.age = -80;
console.log(person.age); // 0
person.age = 34;
console.log(person.age); // 34
/*
Обычные свойства имеют имя и значение.
Кроме этого каждое свойство имеет также атрибуты: writable, enumerable, configurable
Эти 3 атрибута можно изменять при помощи объекта, который называется дескриптором свойства - getOwnPropertyDescriptor
///
writable – значение свойства можно менять, если true. По умолчанию false.
configurable – если true, то свойство можно удалять, а также менять его в дальнейшем при помощи новых вызовов defineProperty.
По умолчанию false.
enumerable – если true, то свойство просматривается в цикле for..in и методе Object.keys(). По умолчанию false.
*/
console.log(Object.getOwnPropertyDescriptor(person, "name")); // Object { value: "Sorax", writable: true, enumerable: true, configurable: true }
console.log(Object.getOwnPropertyDescriptor(person, "age")); // Object { get: get age(), set: set age(), enumerable: true, configurable: true }
// Для определения или переопределения свойств мы можем использовать статический метод defineProperty
Object.defineProperty(person, "gender", {
value: "male",
writable: false,
enumerable: false,
configurable: false
});
console.log(person.gender); // male
// поскольку мы поставили writable: false, то мы не сможем изменить это свойство
person.gender = "female";
console.log(person.gender); // male
// ЦИКЛ FOR IN
for (property in person) {
console.log(property); // name _age age Здесь все перечисляемые свойства объекта, в т.ч наследованные
// свойство gender не выводится, т.к в его дескрипторе enumerable: false
}
// Статический метод keys возвращает массив всех полей, т.е названий только перечисляемых свойств
console.log(Object.keys(person)); // Array [ "name", "_age", "age" ]
console.log(person.propertyIsEnumerable("gender")); // false
// У нас есть метод определения свойств. Он принимает 2 параметра вместо 3
var o = {};
Object.defineProperties(o, {
x: {
value: 10,
writable: false
},
y: {
value: 20,
writable: false
},
r: {
get: function() {
return Math.sqrt(this.x * this.x + this.y * this.y);
}
}
});
console.log(o.r); // 22.360679774997898
// РАСШИРЯЕМОСТЬ ОБЪЕКТОВ - ВОЗМОЖНОСТЬ ДОБАВЛЕНИЯ НОВЫХ СВОЙСТВ
var obj = {};
console.log(Object.isExtensible(obj)); // true
var obj = {};
Object.preventExtensions(obj);
console.log(Object.isExtensible(obj)); // false
// проверим можем ли добавлять свйства к этому объекту
obj.x = 2323;
console.log(obj.x); // undefined
Object.seal(obj);
console.log(Object.isSealed(obj)); // true
/*
Метод Object.seal() запечатывает объект, предотвращая добавление новых свойств к объекту и делая все
существующие свойства не настраиваемыми.
Значения представленных свойств всё ещё могут изменяться, поскольку они остаются записываемыми.
*/
Object.freeze(obj);
console.log(Object.isFrozen(obj)); // true
/*
Метод Object.freeze() замораживает объект: это значит, что он предотвращает добавление новых свойств к объекту,
удаление старых свойств из объекта и изменение существующих свойств или значения их атрибутов перечисляемости,
настраиваемости и записываемости.
В сущности, объект становится эффективно неизменным. Метод возвращает замороженный объект.
*/
Комментариев нет:
Отправить комментарий