Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.10.2011, 07:05
Интересующийся
Отправить личное сообщение для jazzz13 Посмотреть профиль Найти все сообщения от jazzz13
 
Регистрация: 31.05.2011
Сообщений: 25

ООП, this, приватные методы, я не понимаю. Помогите!
Добрый день, уважаемые знатоки.
Я изучаю ООП в javascript и сегодня мое сознание терзает один вопрос .
Как я читал в учебниках и интернете при вызове функции - конструктора (new Class(par)) инициализируется новый объект и на него ставится указатель this.
Все верно, и с учетом замыканий, я предполагал, что любое упоминание слова this это указатель на создаваемый объект, но в приватных методах это не получается. Вот код:
function Class(){
	var curThis = this;
	this.publickMethod = function(){
		console.log(this);
		privateMethod();
	};
	function privateMethod(){
		console.log(curThis);
		console.log(this);
	};
};

var a = new Class();
a.publickMethod();
Я ожидал увидеть в консоли три объекта одного класса, но на практике последний объект window.

Пожалуйста разъясните мне, выходит не любое this в конструкторе это новый объект?

Заранее спасибо!

UPD и еще вопрос на закуску:
Можно ли при наследовании определять свойства родительского класса таким образом:
function A(name){
	this.getName = function(){console.log(name)};
};

function B(name){
	this = new A(name);
	......
}
Вроде не получается. Почему?

Последний раз редактировалось jazzz13, 28.10.2011 в 07:22.
Ответить с цитированием
  #2 (permalink)  
Старый 28.10.2011, 08:47
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от jazzz13
Пожалуйста разъясните мне, выходит не любое this в конструкторе это новый объект?
Вот есть статейка...
http://javascript.ru/tutorial/object/thiskeyword

Последний раз редактировалось ksa, 28.10.2011 в 08:58.
Ответить с цитированием
  #3 (permalink)  
Старый 28.10.2011, 08:57
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от jazzz13 Посмотреть сообщение
Можно ли при наследовании определять свойства родительского класса таким образом:
function A(name){
	this.getName = function(){console.log(name)};
};
Вроде не получается. Почему?
Так это уже не свойство! А метод...

function Test(Name) {
	this.getName = function(Name){alert(Name)};
};
var a = new Test();
a.getName('Text');
Ответить с цитированием
  #4 (permalink)  
Старый 28.10.2011, 13:47
Интересующийся
Отправить личное сообщение для jazzz13 Посмотреть профиль Найти все сообщения от jazzz13
 
Регистрация: 31.05.2011
Сообщений: 25

Цитата:
Вот есть статейка...
http://javascript.ru/tutorial/object/thiskeyword
Я ее и читал, и там ничего толком об этой проблеме не написано.
Выходит, что this не поддается замыканию?

А на счет второго вопроса : я сам понял. В this нельзя что-то присвоить, можно только обернуть (Class.call(this,...)). Верно? ksa, да я перепутал свойство и метод, но суть была в другом.
Ответить с цитированием
  #5 (permalink)  
Старый 28.10.2011, 13:49
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от jazzz13
Я ее и читал, и там ничего толком об этой проблеме не написано.
Да брось...
Цитата:
Если функция вызывается через new как конструктор объекта, то this ставится на создаваемый объект:
...
сли функция запущена как свойство объекта, то в this будет ссылка на этот объект.
obj.func(параметры)
// или
obj['func'](параметры)

При этом совершенно неважно, откуда эта функция взялась. Важно лишь, какой перед func стоит объект.
Сообщение от jazzz13
В this нельзя что-то присвоить, можно только обернуть
Ты опять используешь какие-то, придуманые тобой, слова... Они никому не нужны... И не используй их сам. Читай доку и используй общепринятые термины.
Так хоть будет понятней про что ты спрашиваешь...

Последний раз редактировалось ksa, 28.10.2011 в 13:51.
Ответить с цитированием
  #6 (permalink)  
Старый 28.10.2011, 14:49
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от jazzz13
что this не поддается замыканию?
Именно.
Вот, почитай: http://dmitrysoshnikov.com/ecmascrip...hapter-3-this/
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #7 (permalink)  
Старый 28.10.2011, 16:04
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

function Class(){
	var curThis = this;
	this.publickMethod = function(){
		console.log(this);
		privateMethod.apply(this, arguments);
	};
	function privateMethod(){
		console.log(curThis);
		console.log(this);
	};
};

var a = new Class();
a.publickMethod();
Ответить с цитированием
  #8 (permalink)  
Старый 31.10.2011, 19:50
Интересующийся
Отправить личное сообщение для jazzz13 Посмотреть профиль Найти все сообщения от jazzz13
 
Регистрация: 31.05.2011
Сообщений: 25

Всем спасибо. Теперь я знаю ответы на свои вопросы.

1: this не поддается замыканию.

2: this'у нельзя ничего присвоить.
Ответить с цитированием
  #9 (permalink)  
Старый 01.11.2011, 15:33
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

При вызове функции можно явно указать this используя call или apply.
__________________
kobezzza
code monkey
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите ничего не понимаю Nata Общие вопросы Javascript 1 23.07.2009 16:24