- 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);
}
}
Хм, а зачем that?
http://ideone.com/51KoTe
Если взять какой-нибудь сишарп, там obj.Method по сути создаст делегат, который захватит объект obj, а при вызове будет вызывать соответствующий метод объекта. Аналогичный механизм есть в питоне.
В js такого нет, там obj.Method по сути является крестовым указателем на метод, которому ещё нужно передавать this. Поэтому автор кода в топике и создаёт that, чтобы замыкание, созданное в конструкторе, всегда использовало тот объект, для которого оно было сконструировано.
если использовать square.func без скобок, контекст теряется.
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.
Но здесь это почти не нужно.
Писать в каждой функции that - это какой-то китайский подход.
Как в примере анонимба чуть выше?
Или самописный вариант, если вышеописаное недоступно (в скриптах на Анте, например).
Да, самописный вариант так же понадобится при наследовании "методов", т.как нужна будет процедура по извлечению непривязаного метода и созданию новой привязывающей функции.
Вобщем, как обычно, ж.скрипт стандарт думает только на один шаг вперед, чтобы не переутруждаться и оставить хороший задел для следующих поколений писателей говностандарта.
Она не очень оптимальна, т.как унаследованые методы копируются (зато быстрее, чем искать по цепочке), но это можно доработать.
Особо не тестировал, но на первый взгляд (и для той мелочи, которую писал) - хватало. Кстати, если интересно. Простая объектная система, в принципе работающая как в ж.скрипте, только с нормальной привязкой this, и без еботни с прототипами.
ИМХО это самый лучший вариант.