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 );