Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ООП, this, приватные методы, я не понимаю. Помогите! (https://javascript.ru/forum/misc/22674-oop-privatnye-metody-ya-ne-ponimayu-pomogite.html)

jazzz13 28.10.2011 07:05

ООП, this, приватные методы, я не понимаю. Помогите!
 
Добрый день, уважаемые знатоки.
Я изучаю ООП в javascript и сегодня мое сознание терзает один вопрос:help: .
Как я читал в учебниках и интернете при вызове функции - конструктора (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 в конструкторе это новый объект?

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

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

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

ksa 28.10.2011 08:47

Цитата:

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

Вот есть статейка...
http://javascript.ru/tutorial/object/thiskeyword

ksa 28.10.2011 08:57

Цитата:

Сообщение от jazzz13 (Сообщение 133210)
Можно ли при наследовании определять свойства родительского класса таким образом:
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');

jazzz13 28.10.2011 13:47

Цитата:

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

А на счет второго вопроса : я сам понял. В this нельзя что-то присвоить, можно только обернуть (Class.call(this,...)). Верно? ksa, да я перепутал свойство и метод, но суть была в другом.

ksa 28.10.2011 13:49

Цитата:

Сообщение от jazzz13
Я ее и читал, и там ничего толком об этой проблеме не написано.

Да брось... :)
Цитата:

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

При этом совершенно неважно, откуда эта функция взялась. Важно лишь, какой перед func стоит объект.
Цитата:

Сообщение от jazzz13
В this нельзя что-то присвоить, можно только обернуть

Ты опять используешь какие-то, придуманые тобой, слова... :) Они никому не нужны... И не используй их сам. Читай доку и используй общепринятые термины.
Так хоть будет понятней про что ты спрашиваешь... ;)

B~Vladi 28.10.2011 14:49

Цитата:

Сообщение от jazzz13
что this не поддается замыканию?

Именно.
Вот, почитай: http://dmitrysoshnikov.com/ecmascrip...hapter-3-this/

nikita.mmf 28.10.2011 16:04

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

jazzz13 31.10.2011 19:50

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

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

2: this'у нельзя ничего присвоить.

kobezzza 01.11.2011 15:33

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


Часовой пояс GMT +3, время: 09:25.