68. Методы объектов.
Свойства-функции называют «методами» объектов.
Методы объектов можно добавлять и удалять в любой момент, в том числе и явным присваиванием.
user.sayHi = function() {
// присвоили метод после создания объекта
alert(‘Привет!’);
};
// Вызов метода:
user.sayHi();
Доступ к объекту через this
Для доступа к текущему объекту из метода используется ключевое слово this
var user = {
name: ‘Василий’,
sayHi: function() {
alert( this.name );
}
};
user.sayHi(); // sayHi в контексте user
var user = {
name: ‘Василий’,
sayHi: function() {
alert( user.name ); // приведёт к ошибке
}
};
var admin = user;
user = null;
admin.sayHi();
// !внутри sayHi обращение по старому имени, ошибка!
Через this метод может не только обратиться к любому свойству объекта, но и передать куда-то ссылку на сам объект целиком:
var user = {
name: ‘Василий’,
sayHi: function() {
showName(this); // передать текущий объект в showName }};
function showName(namedObj) {
alert( namedObj.name );}
user.sayHi(); // Василий
Значение this называется контекстом вызова и будет определено в момент вызова функции.
function sayHi() { alert( this.firstName );}
Если одну и ту же функцию запускать в контексте разных объектов, она будет получать разный this:
var user = { firstName: “Вася” };
var admin = { firstName: “Админ” };
function func() { alert( this.firstName );}
user.f = func;
admin.g = func;// this равен объекту перед точкой:
user.f(); // Вася
admin.g(); // Админ
admin‘g’; // Админ (не важно, доступ к объекту через точку или квадратные скобки)
Значение this при вызове без контекста
ситуация возникает при ошибке в разработке.
//this получает значение window, глобального объекта:
function func() {
alert( this ); // выведет [object Window] или [object global]
}
func();
function func() {
“use strict”;
alert( this ); // выведет undefined (кроме IE9-)
}
func();
Ссылочный тип
потеря контекста:
var user = {
name: “Вася”,
hi: function() { alert(this.name); },
bye: function() { alert(“Пока”); }
};
user.hi(); // Вася (простой вызов работает)
// а теперь вызовем user.hi или user.bye в зависимости от имени
(user.name == “Вася” ? user.hi : user.bye)(); // undefined
obj.method()
Reference Type
base – как раз объект,
name – имя свойства,
strict – вспомогательный флаг для передачи use strict.
Скобки () получают из base значение свойства name и вызывают в контексте base.
Другие операторы получают из base значение свойства name и используют, а остальные компоненты игнорируют.
Каким будет результат?
var arr = [“a”, “b”, “c” ];
//Вызов в контексте массива
arr.push(function() {
alert( this );
})
arr3;
Каким будет результат?
var obj = {
go: function() { alert(this) }
}
(obj.go)()
Каким будет вывод?
var user = { firstName: “Василий”, export: this};
alert( user.export.firstName );
var name = “”;
var user = { name: “Василий”,
export: function() { return this; }
};
alert( user.export().name );