|
|
|
|
function A ( ){
this.t = function () { alert('Hello my little friend') }
}
var a = new A();
a.t();
|
Что означает this здесь, почему для каждого свойства и метода его нужно писать, почему без него нельзя описать свойство или метод? | |
|
|
|
|
|
|
|
для: Golovastik
(02.03.2011 в 21:14)
| | Потому что помимо свойств и методов класса, есть обычные переменные и функции, чтобы их различать используется this - ссылка на текущий объект класса. Это еще с C++ повелось. | |
|
|
|
|
|
|
|
для: cheops
(02.03.2011 в 21:21)
| | this - эт овообще объект или это такая же конструкция языка, как фор, или вайл? | |
|
|
|
|
|
|
|
для: Golovastik
(02.03.2011 в 21:25)
| | Конструкция, но указывает она на объект. | |
|
|
|
|
|
|
|
для: 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 пункта из той ссылки правильно.
Заранее благодарю. | |
|
|
|
|
|
|
|
для: Golovastik
(03.03.2011 в 01:15)
| | 1. Когда вы пишите this внутри метода класса, вы еще не знаете как будет называться объект, он может называться animal, может man, может object - поэтому вы указываете this, потом, когда объект будет создан - вместо этого this будет подставлено название объекта.
2. Объект класса создается при помощи оператора new - в этот момент под него и выделяется память, которая связывается с именем animal. Первым методом вызывается конструктор объекта, который производит инициализацию выделенной памяти. Строка
по сути эквивалентна
просто на момент создания конструктора мы не могли знать как будет называться класс и использовали для его обозначения специальное ключевое слово this.
3. Как уже было сказано в пункте 2, классы обладают не только рядовыми, но и специальными методами, один из таких методов - конструктор, его не нужно вызывать явно, он вызывается сразу после выделения объекту памяти неявным образом - в его задачи входит привести выделенную память в рабочее состояние, чтобы объект мог начать работать.
PS В JavaScript эти концепции немного сложнее воспринимать, так как вы не заботитесь о выделении и возвращении памяти (как в C++), за вас эту работу выполняет язык программирования. Поэтому многие для других ООП-языков вещи ускользают от внимания. JavaScript вообще в этом плане очень хитрый язык - он маскирует сложность, на самом деле в нем до черта достаточно сложных концепций, которые намерено убраны с глаз долой, чтобы не смущать разработчиков до времени. | |
|
|
|
|
|
|
|
для: cheops
(03.03.2011 в 01:32)
| |
// Вот здесь в первой строке метод Animal - это класс?
function Animal(name) {
this.name = name
}
animal = new Animal("beastie");
|
Скажите, а сам this находится в оперативной памяти компа, где-то в ячейке? И в этот момент, когда конструктор вызвался, он сразу инициализировал объект animal выделив сразу и память для него и сразу сам конструктор с именем Animal стал указывать на любое свойство и метод класса Animal или сама конструкция this,которая лежит где-то в оперативной памяти компа и хранит адрес, стала хранит ссылку, а не конструктор стал хранить ссылку на любое свойство или метод класса? | |
|
|
|
|
|
|
|
для: 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 внутри этой же функции НЕЛЬЗЯ.
----
Вот и всё.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Абырвалг
(03.03.2011 в 04:07)
| | this указывает на объект класса или на свойство или метод класса?
1)А где хранится this само, в чём оно находится, в интерпретаторе или в ячейке Оп памяти?
2)
animal = new Animal("beastie");
| После вызова конструктора, конструктор инициализировал объект и конструктор стал указывать на этот объект или this(встроенная конструкция языка джаваскрипт)?
3)Вот этот код:
function Animal(name) {
this.name = name
}
|
Это создание конструктора или класса Javascript? | |
|
|
|
|
|
|
|
для: Golovastik
(04.03.2011 в 00:19)
| | См. пункт первый в моём предыдущем сообщении.
Там большими буковками написано - НЕТ классов в яваскрипте.
НЕТУ их!
СОВСЕМ нету.
Теперь свои вопросы - ВСЕ! - перечитайте.
Где есть слово "класс" - выкиньте на помойку.
Что останется непонятным - спрашивайте.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Абырвалг
(04.03.2011 в 03:13)
| | Если в Яваскрипте нету классов, тогда когда я создаю объект, я создаю объект объекта получается? | |
|
|
|
|
130.7 Кб |
|
|
для: Golovastik
(04.03.2011 в 21:55)
| | Именно так. См. аттач --> | |
|
|
|
|
|
|
|
для: Абырвалг
(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>
|
| |
|
|
|
|
|
|
|
для: Golovastik
(04.03.2011 в 22:58)
| | Опять двадцать пять.
Опять - "класс это или не класс?", "создан метод или не метод?"
НЕТУ классов. НЕТУ методов.
СОВСЕМ НЕТУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУ!
Ни одного класса. Ни одного метода.
И встроенных нет.
И создать их НЕЛЬЗЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ!
------
Функция - это один из имеющихся в JS объектов.
Всякий объект может иметь свойства. Вы их можете создать.
Но только - СВОЙСТВА.
Не методы и не классы, а именно и только - СВОЙСТВА.
Если свойство объекта - это тоже объект, получается "объект объекта".
Что непонятного-то?:-))) | |
|
|
|
|
|
|
|
для: Абырвалг
(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>
|
| |
|
|
|
|
|
|
|
для: 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 - это таки НОВЫЙ объект
|
| |
|
|
|
|
|
|
|
для: Абырвалг
(04.03.2011 в 23:49)
| | 1)То есть написав функцию, а внутри неё свойства - это равносильно что я создал объект с именем ТЕСТ а в нём свойства.
2)Я понял что ссср это новый объект, вы где-то выше писали что свойство объекта, тоже становится объектом это правда?
3)Значит объявление метода со свойствами - это описание конструктора?
Вот это я описал конструктор?
function test(){
this.a = "Чай";
document.write(this.a);
}
А если бы я просто объявил функцию со свойствами, но не создавал бы объекта, тогда вот это:
function test(){
this.a = "Чай";
document.write(this.a);
}
|
означало бы создание объекта со свойствами? | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: Абырвалг
(05.03.2011 в 01:11)
| |
function test(){
this.a = "Чай";
document.write(this.a);
}
|
Этот код - это описание конструктора test и одновременное его создание? | |
|
|
|
|
|
|
|
для: Golovastik
(05.03.2011 в 01:51)
| | Нет, этот код - всего лишь создание объекта test.
Он, этот объект test, пока лишь мальчик.
Но, как и всякая особь мужского рода, этот мальчик имеет первичные половые признаки, сиречь видимую потенциальную способность в будущем стать ПАПОЙ-конструктором.
Если Вы позже с помощью test создадите новый объект, то этот самый test станет конструктором - мальчик вырос и стал ПАПОЙ, родив нового мальчика. | |
|
|
|
|
|
|
|
для: Golovastik
(02.03.2011 в 21:14)
| | http://www.cyberforum.ru/cpp-beginners/thread86260.html
вот почитай.. а вообще тег для поиска "c++ указатель this" | |
|
|
|
|
|
|
|
для: Tonik992
(05.03.2011 в 17:20)
| | не когда бы не подумал что так сложно обьяснить что означает this. =)
автор не много отдохни а потом прочитай ниже
например ты создал function (wer) и когда ты внутри всякое описываешь то когда тебе надо будет сослатся на саму функцию тебе нужно использовать this
и тоже самое в jquery когда выбираешь обьект и тебе надо сним что то делать то используется this
ну переведи с английского слово this и включи логику >_< а как его правильно называть это не имеет значения
ъ
а вот прочитал пост Абырвалг все тоже самое | |
|
|
|
|
|
|
|
для: Tonik992
(05.03.2011 в 17:20)
| | >http://www.cyberforum.ru/cpp-beginners/thread86260.html
>вот почитай.. а вообще тег для поиска "c++ указатель this"
this изначально пошел из C++. Но this в С++ и JavaScript отличаются, эту мысль и пытается донести Абырвалг. Объектные модели отличаются, поэтому есть различия. Если в C++ без воли программиста ни один объект не рождается, но в JavaScript они только так и рождаются. | |
|
|
|