Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: this - кто он и зачем он?
 
 автор: Golovastik   (02.03.2011 в 21:14)   письмо автору
 
 

function A ( ){
this.t = function () { alert('Hello my little friend') }
}
var a = new A();
a.t();


Что означает this здесь, почему для каждого свойства и метода его нужно писать, почему без него нельзя описать свойство или метод?

  Ответить  
 
 автор: cheops   (02.03.2011 в 21:21)   письмо автору
 
   для: Golovastik   (02.03.2011 в 21:14)
 

Потому что помимо свойств и методов класса, есть обычные переменные и функции, чтобы их различать используется this - ссылка на текущий объект класса. Это еще с C++ повелось.

  Ответить  
 
 автор: Golovastik   (02.03.2011 в 21:25)   письмо автору
 
   для: cheops   (02.03.2011 в 21:21)
 

this - эт овообще объект или это такая же конструкция языка, как фор, или вайл?

  Ответить  
 
 автор: cheops   (02.03.2011 в 21:28)   письмо автору
 
   для: Golovastik   (02.03.2011 в 21:25)
 

Конструкция, но указывает она на объект.

  Ответить  
 
 автор: Golovastik   (03.03.2011 в 01:15)   письмо автору
 
   для: cheops   (02.03.2011 в 21:28)
 

Читаю здесь http://javascript.ru/tutorial/object/thiskeyword

function Animal(name) {
    this.name = name
}
animal = new Animal("beastie");

Если следовать согласно картинке по этой ссылке:
1. Конструктор Animal инициализирует объект под названием animal.
2. После того, как инициализация объекта под названием animal прошла.
конструктор Animal создал где-то в оперативной памяти ячейку с названием this
которая стала ссылаться на свойства и методы конструктора под названием Animal?
3. Что вызывается если уже всё вызвалось ,если следовать согласно картинке?

Расшифруйте пожалуйста те, 3 пункта из той ссылки правильно.
Заранее благодарю.

  Ответить  
 
 автор: cheops   (03.03.2011 в 01:32)   письмо автору
 
   для: Golovastik   (03.03.2011 в 01:15)
 

1. Когда вы пишите this внутри метода класса, вы еще не знаете как будет называться объект, он может называться animal, может man, может object - поэтому вы указываете this, потом, когда объект будет создан - вместо этого this будет подставлено название объекта.
2. Объект класса создается при помощи оператора new - в этот момент под него и выделяется память, которая связывается с именем animal. Первым методом вызывается конструктор объекта, который производит инициализацию выделенной памяти. Строка
this.name = name

по сути эквивалентна
animal.name = name

просто на момент создания конструктора мы не могли знать как будет называться класс и использовали для его обозначения специальное ключевое слово this.
3. Как уже было сказано в пункте 2, классы обладают не только рядовыми, но и специальными методами, один из таких методов - конструктор, его не нужно вызывать явно, он вызывается сразу после выделения объекту памяти неявным образом - в его задачи входит привести выделенную память в рабочее состояние, чтобы объект мог начать работать.

PS В JavaScript эти концепции немного сложнее воспринимать, так как вы не заботитесь о выделении и возвращении памяти (как в C++), за вас эту работу выполняет язык программирования. Поэтому многие для других ООП-языков вещи ускользают от внимания. JavaScript вообще в этом плане очень хитрый язык - он маскирует сложность, на самом деле в нем до черта достаточно сложных концепций, которые намерено убраны с глаз долой, чтобы не смущать разработчиков до времени.

  Ответить  
 
 автор: Golovastik   (03.03.2011 в 01:59)   письмо автору
 
   для: cheops   (03.03.2011 в 01:32)
 


// Вот здесь в первой строке метод Animal - это класс?
function Animal(name) { 
    this.name = name 
}
animal = new Animal("beastie");


Скажите, а сам this находится в оперативной памяти компа, где-то в ячейке? И в этот момент, когда конструктор вызвался, он сразу инициализировал объект animal выделив сразу и память для него и сразу сам конструктор с именем Animal стал указывать на любое свойство и метод класса Animal или сама конструкция this,которая лежит где-то в оперативной памяти компа и хранит адрес, стала хранит ссылку, а не конструктор стал хранить ссылку на любое свойство или метод класса?

  Ответить  
 
 автор: Абырвалг   (03.03.2011 в 04:07)   письмо автору
 
   для: Golovastik   (03.03.2011 в 01:59)
 

Да будьте Вы проще.

1. В яваскрипте НЕТ ни классов, ни методов ВОВСЕ.
2. Есть простые переменные и объекты (которые как бы "сложные", в противовес переменным).

3. У объектов могут быть свойства. А у переменных свойств нет и быть не может.
4. Объектами в яваскрипте (именно в яваскрипте, не путать с DHTML, где автоматом появляются объекты document, window... коллекции all, options..., методы add, appandChild... и прочее) могут быть либо массивы, либо функции, либо конкретные объекты (Object, String, Number, Error, Date,...)

5. Чтобы парсер смог разобрать где объект, а где - переменная, объекты надо ЗАРАНЕЕ объявить.
6. Функция объявляется так: var myFunc = new Function (); либо function myFunc () {}

7. Как только объявили объект-функцию, можете назначать ей(ему) свойства.
Так: function myFunc () {this.prorerty1 = 'что-то';}

8. Затем можете это 'что-то' читать или вызывать: var S = myFunc.prorerty1 (); либо просто вызвать myFunc.prorerty1 ();

Так что this внутри функции - это ссылка на саму функцию как объект. И используется он (this) ТОЛЬКО при назначении (write) какого-либо свойства. Читать (read) свойство через this внутри этой же функции НЕЛЬЗЯ.
----

Вот и всё.

[поправлено модератором]

  Ответить  
 
 автор: Golovastik   (04.03.2011 в 00:19)   письмо автору
 
   для: Абырвалг   (03.03.2011 в 04:07)
 

this указывает на объект класса или на свойство или метод класса?

1)А где хранится this само, в чём оно находится, в интерпретаторе или в ячейке Оп памяти?
2)

animal = new Animal("beastie");
  
После вызова конструктора, конструктор инициализировал объект и конструктор стал указывать на этот объект или this(встроенная конструкция языка джаваскрипт)?
3)Вот этот код:

function Animal(name) { 
    this.name = name 
}

Это создание конструктора или класса Javascript?

  Ответить  
 
 автор: Абырвалг   (04.03.2011 в 03:13)   письмо автору
 
   для: Golovastik   (04.03.2011 в 00:19)
 

См. пункт первый в моём предыдущем сообщении.
Там большими буковками написано - НЕТ классов в яваскрипте.

НЕТУ их!
СОВСЕМ нету.

Теперь свои вопросы - ВСЕ! - перечитайте.
Где есть слово "класс" - выкиньте на помойку.
Что останется непонятным - спрашивайте.

[поправлено модератором]

  Ответить  
 
 автор: Golovastik   (04.03.2011 в 21:55)   письмо автору
 
   для: Абырвалг   (04.03.2011 в 03:13)
 

Если в Яваскрипте нету классов, тогда когда я создаю объект, я создаю объект объекта получается?

  Ответить  
 
 автор: Абырвалг   (04.03.2011 в 22:57)   письмо автору
130.7 Кб
 
   для: Golovastik   (04.03.2011 в 21:55)
 

Именно так. См. аттач -->

  Ответить  
 
 автор: Golovastik   (04.03.2011 в 22:58)   письмо автору
 
   для: Абырвалг   (04.03.2011 в 22:57)
 

Прочитал здесь: http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D1%82%D0%B8%D0%BF%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5


В прототип-ориентированных системах предоставляется два метода 
создания нового объекта: клонирование существующего объекта,
 либо создание объекта «с нуля». 


Получается написав так я объявил просто метод ТЕСТ со свойствами, но не класс?

<script type="text/javascript">
function test(){
    this.a = "Чай";
    document.write(this.a);
}

var sssr = new test;
sssr.a;
</script>

  Ответить  
 
 автор: Абырвалг   (04.03.2011 в 23:04)   письмо автору
 
   для: Golovastik   (04.03.2011 в 22:58)
 

Опять двадцать пять.
Опять - "класс это или не класс?", "создан метод или не метод?"

НЕТУ классов. НЕТУ методов.
СОВСЕМ НЕТУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУ!
Ни одного класса. Ни одного метода.

И встроенных нет.
И создать их НЕЛЬЗЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ!
------

Функция - это один из имеющихся в JS объектов.
Всякий объект может иметь свойства. Вы их можете создать.
Но только - СВОЙСТВА.
Не методы и не классы, а именно и только - СВОЙСТВА.

Если свойство объекта - это тоже объект, получается "объект объекта".
Что непонятного-то?:-)))

  Ответить  
 
 автор: Golovastik   (04.03.2011 в 23:28)   письмо автору
 
   для: Абырвалг   (04.03.2011 в 23:04)
 

Здесь уточнить момент хотел.

<script type="text/javascript">
function test(){  //Это создание метода с именем ТЕСТ, тоже самое что я создал объект ТЕСТ?
    this.a = "Чай"; 
    document.write(this.a);
}

/*Если свойство объекта - это тоже объект, получается "объект объекта".*/
//То есть sssr.a    свойство а - это объект?
var sssr = new test;
sssr.a;
</script>

  Ответить  
 
 автор: Абырвалг   (04.03.2011 в 23:49)   письмо автору
 
   для: Golovastik   (04.03.2011 в 23:28)
 

Уточняю.
function test ()   //Это создание объекта test
{
this.abc = 'Чай'; //Это создание свойства abc объекта test


var sssr = new test; //Это создание НОВОГО объекта sssr, наследующего все свойства объекта test

alert (sssr.abc); //И здесь Вы убеждаетесь, что свойства объекта test унаследованы

sssr.def = 'Кофе'; //Это создание свойства def у объекта sssr

alert (sssr.def); //Проверяете новое свойство def у объекта sssr

alert (test.def); //А здесь, увидев пустоту, Вы убеждаетесь, что sssr - это таки НОВЫЙ объект

  Ответить  
 
 автор: Golovastik   (05.03.2011 в 00:07)   письмо автору
 
   для: Абырвалг   (04.03.2011 в 23:49)
 

1)То есть написав функцию, а внутри неё свойства - это равносильно что я создал объект с именем ТЕСТ а в нём свойства.
2)Я понял что ссср это новый объект, вы где-то выше писали что свойство объекта, тоже становится объектом это правда?

3)Значит объявление метода со свойствами - это описание конструктора?
Вот это я описал конструктор?


function test(){
this.a = "Чай";
document.write(this.a);
}

А если бы я просто объявил функцию со свойствами, но не создавал бы объекта, тогда вот это:

function test(){
    this.a = "Чай";
    document.write(this.a);
}


означало бы создание объекта со свойствами?

  Ответить  
 
 автор: Абырвалг   (05.03.2011 в 01:11)   письмо автору
 
   для: Golovastik   (05.03.2011 в 00:07)
 

Кто-то из гитлеровских приспешников, по-моему - Геббельс, говорил: "Когда я слышу слово интеллигент, моя рука тянется к спусковому крючку автомата".

Я сейчас вот ТОЧНО ТАКЖЕ хочу Вас... ну хотя бы чем-нить сильно ударить.
После того, как я Вам здесь десять раз написал, САМЫМИ БОЛЬШИМИ буквами написал - "НЕТУ методов в JS", Вы меня спрашиваете: "Значит объявление метода со свойствами - это описание конструктора?"

Так и хочется спросить словами незабвенного Паниковского: "МЕТОД - он Вам кто? Он Ваш папа - этот МЕТОД?"
------------

Любое объявление/создание любого нового объекта в JS происходит с использованием конструктора.
Либо встроенного, либо Вами созданного.

Пример:
var s1 = new String ('строка'); //Создаём объект типа String
alert (s1.constructor); //Получаем название конструктора, при помощи которого этот объект создан - function String

s1.alfa = 125; //У этой строки (именно потому, что она создана как ОБЪЕКТ) могут быть свойства.
//Причём, как видите, свойства могут быть и не строковыми, а численными (да какими угодно, хоть другой объект)

alert (s1.alfa); //проверяете свойство alfa у объекта s1

s1.beta = new Array (); //Пример "объекта объекта": свойство beta объекта s1 - это массив (тоже ОБЪЕКТ);
alert (s1.beta.constructor); //Раз это ОБЪЕКТ объекта, то у него при создании был конструктор - function Array

var s2 = 'тоже строка'; //Создали просто строку, как переменную, не как объект
s2.gamma = 123; //Попытались назначить переменной s2 свойство gamma
alert (s2.gamma); //Читаете свойство gamma - а там undefined. Ибо у переменных не бывает свойств.

function test () {} //Создаете объект test
alert (test.constructor); //Вот вам конструктор, который создал объект test - function Function

var sssr = new test; //Клонируете объект test, создавая новый объект sssr
alert (sssr.constructor); //Вот вам конструктор, который создал объект sssr - это Вами лично созданный ранее конструктор function test

  Ответить  
 
 автор: Golovastik   (05.03.2011 в 01:51)   письмо автору
 
   для: Абырвалг   (05.03.2011 в 01:11)
 


function test(){ 
    this.a = "Чай"; 
    document.write(this.a); 



Этот код - это описание конструктора test и одновременное его создание?

  Ответить  
 
 автор: Абырвалг   (05.03.2011 в 10:21)   письмо автору
 
   для: Golovastik   (05.03.2011 в 01:51)
 

Нет, этот код - всего лишь создание объекта test.
Он, этот объект test, пока лишь мальчик.
Но, как и всякая особь мужского рода, этот мальчик имеет первичные половые признаки, сиречь видимую потенциальную способность в будущем стать ПАПОЙ-конструктором.

Если Вы позже с помощью test создадите новый объект, то этот самый test станет конструктором - мальчик вырос и стал ПАПОЙ, родив нового мальчика.

  Ответить  
 
 автор: Tonik992   (05.03.2011 в 17:20)   письмо автору
 
   для: Golovastik   (02.03.2011 в 21:14)
 

http://www.cyberforum.ru/cpp-beginners/thread86260.html
вот почитай.. а вообще тег для поиска "c++ указатель this"

  Ответить  
 
 автор: kvins   (05.03.2011 в 20:41)   письмо автору
 
   для: Tonik992   (05.03.2011 в 17:20)
 

не когда бы не подумал что так сложно обьяснить что означает this. =)
автор не много отдохни а потом прочитай ниже

например ты создал function (wer) и когда ты внутри всякое описываешь то когда тебе надо будет сослатся на саму функцию тебе нужно использовать this

и тоже самое в jquery когда выбираешь обьект и тебе надо сним что то делать то используется this
ну переведи с английского слово this и включи логику >_< а как его правильно называть это не имеет значения

ъ
а вот прочитал пост Абырвалг все тоже самое

  Ответить  
 
 автор: cheops   (06.03.2011 в 14:51)   письмо автору
 
   для: Tonik992   (05.03.2011 в 17:20)
 

>http://www.cyberforum.ru/cpp-beginners/thread86260.html
>вот почитай.. а вообще тег для поиска "c++ указатель this"
this изначально пошел из C++. Но this в С++ и JavaScript отличаются, эту мысль и пытается донести Абырвалг. Объектные модели отличаются, поэтому есть различия. Если в C++ без воли программиста ни один объект не рождается, но в JavaScript они только так и рождаются.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования