На странице учебника JavaScript я увидел такой пример:
var user = { firstName: "Вася" };
var admin = { firstName: "Админ" };
function func() {
alert( this.firstName );
}
user.f = func;
admin.g = func;
// this равен объекту перед точкой:
user.f(); // Вася
admin.g(); // Админ
admin['g'](); // Админ (не важно, доступ к объекту через точку или квадратные скобки)
Никак не пойму откуда взялись f и g в объектах user и admin. Как это называется и как работает?
user.f = func;
admin.g = func;
Объекты в Javascript по умолчанию позволяют расширять себя, добавляя методы и поля.
Поэтому при присваивании значения, в случае отсутствия, соответствующее поле будет добавлено непосредственно в объект.
var user = {};
console.log(user.hasOwnProperty('f'));
user.f = "a";
console.log(user.hasOwnProperty('f'));
Однако автоматическое добавление не сработает в случае
Object.preventExtensions
Object.seal
Object.freeze
var user1 = {},
user2 = {},
user3 = {},
user4 = {};
console.log(user1.hasOwnProperty('a'), user2.hasOwnProperty('a'), user3.hasOwnProperty('a'), user4.hasOwnProperty('a'));
Object.preventExtensions(user2);
Object.seal(user3);
Object.freeze(user4);
user1.a = user2.a = user3.a = user4.a = 10;
console.log(user1.hasOwnProperty('a'), user2.hasOwnProperty('a'), user3.hasOwnProperty('a'), user4.hasOwnProperty('a'));
Всё довольно просто, стоит только вывести объект в консоль:
var user = { firstName: "Вася" };
var admin = { firstName: "Админ" };
function func() {
alert( this.firstName );
}
user.f = func;
admin.g = func;
console.log(user);
Здесь мы видим что у объекта появилось новое свойство-функция, которая была присвоена кодом user.f = func;
. Вы можете также присвоить и обычное свойство объекту:
var user = { firstName: "Вася" };
var admin = { firstName: "Админ" };
user.f = "a";
admin.g = 123;
console.log(user);
console.log(admin);
Так Вы же сами добавляете свойства f
и g
объектам. Их значениями является ссылка на функцию func
- при вызове this
берёт свойства у объекта на который ссылается, следовательно в первом случае this.firstName
будет равно "Вася", а во втором - "Админ".
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь настроить запись в базу Firebase RealtimeБаза подключение видит, но записи не происходит
У меня есть следующая задача: При удалении картинки из раздела /src/blocks/nav/assets/img/1jpg я хочу удалить аналогичную картинку в /src/img/
Возможно я просто не полностью понимаю как это должно работатьу меня есть форма, для создания юзера, в этой форме есть модальное окно, и в нем...
знаю, что есть уже несколько таких вопросов, но решения оттуда мне не помогли