- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
window.onload = function()
{
m1 = new Matrix('matrix1', 20, 20);
m1.create();
var square = new Square(1, 2, 'right');
square.create();
setInterval(square.move, 50);
}
function Square(row, col, course)
{
this.body = [row, col];
this.course = course;
var that = this; // <-- 100500 iopta !!!
this.create = function()
{
m1.setCell(that.body[0], that.body[1], true);
}
this.move = function()
{
var last_body = that.body;
switch(that.course)
{
case 'right':
that.body[1]++;
break;
case 'left':
break;
case 'down':
break;
case 'up':
break;
}
m1.setCell(last_body[0], last_body[1], false);
m1.setCell(that.body[0], that.body[1], true);
}
}
tirinox 04.05.2014 21:46 # −2
Хм, а зачем that?
WGH 04.05.2014 22:42 # −2
guest 04.05.2014 22:51 # −1
WGH 04.05.2014 22:52 # −2
hometwo 04.05.2014 22:54 # −54
tirinox 05.05.2014 04:06 # −2
kipar 05.05.2014 11:48 # −2
http://ideone.com/51KoTe
roman-kashitsyn 05.05.2014 11:58 # −1
Если взять какой-нибудь сишарп, там obj.Method по сути создаст делегат, который захватит объект obj, а при вызове будет вызывать соответствующий метод объекта. Аналогичный механизм есть в питоне.
В js такого нет, там obj.Method по сути является крестовым указателем на метод, которому ещё нужно передавать this. Поэтому автор кода в топике и создаёт that, чтобы замыкание, созданное в конструкторе, всегда использовало тот объект, для которого оно было сконструировано.
roman-kashitsyn 05.05.2014 12:31 # 0
если использовать square.func без скобок, контекст теряется.
1024-- 05.05.2014 12:40 # −1
roman-kashitsyn 05.05.2014 12:45 # −1
bormand 05.05.2014 14:09 # −1
roman-kashitsyn 05.05.2014 14:15 # 0
anonimb84a2f6fd141 04.05.2014 23:57 # +1
By convention, we make a private that variable. This is used to make the object available to the private methods. This is a workaround for an error in the ECMAScript Language Specification which causes this to be set incorrectly for inner functions.
Но здесь это почти не нужно.
hometwo 05.05.2014 00:15 # −7
wvxvw 05.05.2014 08:15 # −1
Писать в каждой функции that - это какой-то китайский подход.
bormand 05.05.2014 09:40 # −2
Как в примере анонимба чуть выше?
wvxvw 05.05.2014 09:59 # −2
Или самописный вариант, если вышеописаное недоступно (в скриптах на Анте, например).
Да, самописный вариант так же понадобится при наследовании "методов", т.как нужна будет процедура по извлечению непривязаного метода и созданию новой привязывающей функции.
Вобщем, как обычно, ж.скрипт стандарт думает только на один шаг вперед, чтобы не переутруждаться и оставить хороший задел для следующих поколений писателей говностандарта.
wvxvw 05.05.2014 10:08 # −2
wvxvw 06.05.2014 16:42 # 0
Она не очень оптимальна, т.как унаследованые методы копируются (зато быстрее, чем искать по цепочке), но это можно доработать.
Особо не тестировал, но на первый взгляд (и для той мелочи, которую писал) - хватало. Кстати, если интересно. Простая объектная система, в принципе работающая как в ж.скрипте, только с нормальной привязкой this, и без еботни с прототипами.
Vasiliy 06.05.2014 18:27 # −1
ИМХО это самый лучший вариант.
roman-kashitsyn 05.05.2014 10:03 # −1
Vasiliy 05.05.2014 12:00 # −2
hometwo 05.05.2014 11:30 # −4
brutushafens 05.05.2014 11:36 # −2