Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

Не так давно мне стало любопытно, насколько сносно современные браузеры поддерживают HTML5 и я не нашел лучшего
способа, чем написать простейший 2D платформер. Помимо удовольствия от разработки игрушки и улучшения навыков в использовании JavaScript, в ходе развлечения кропотливой работы был накоплен определенный опыт и эмпирическим путем были найдены основные грабли, на многие из которых мне пришлось наступить. В этой статье я попробую кратко и с примерами резюмировать то, что вынес для себя из проделанной работы.
this.doDraw = function()
{
if(fNeedRedraw)
{
fNeedRedraw = false;
fGameMap.Draw(fBuffer);
}
}
this.doAnimationLoop = function()
{
requestAnimFrame(fInstance.doAnimationLoop);
fInstance.doDraw();
}
Не следует напрягать движок реализацией классов при помощи прототипирования – выгода сомнительна, а код замедляется в разы (Opera)! Сложное прототипное наследование и честно организованный перенос базового функционала к наследникам сбивают и без того не самую лучшую оптимизацию.
5. Замыкания и свойства – враги быстродействия
function type1()
{
var _x1 = 0, _x2 = 0;
this.setx1 = function(v) { _x1=v; };
this.setx2 = function(v) { _x2=v; };
this.sum = function() { return _x1+_x2; };
}
function type2()
{
this.x1 = 0;
this.x2 = 0;
this.setx1 = function(v) { this.x1=v; };
this.setx2 = function(v) { this.x2=v; };
this.sum = function() { return this.x1 + this.x2; };
}
function type3()
{
var _x1 = 0, _x2 = 0;
Object.defineProperty(this, "x1", {get: function(){ return _x1; }, set: function(v){ _x1 = v; } });
Object.defineProperty(this, "x2", {get: function(){ return _x2; }, set: function(v){ _x2 = v; } });
Object.defineProperty(this, "sum", {get: function() { return _x1 + _x2; } });
}
var t1 = new type1(); var t2 = new type2(); var t3 = new type3();
for(var i = 0; i < loops; i++) { t2.x1 = i; t2.x2 = i + 5; sum += t2.sum(); } //прямой доступ к полям объекта и вызов метода (без замыкания)
for(var i = 0; i < loops; i++) { t1.setx1(i); t1.setx2(i + 5); sum -= t1.sum(); } //доступ к внутренним переменным через замыкания
for(var i = 0; i < loops; i++) { t2.setx1(i); t2.setx2(i + 5); sum += t2.sum(); } //доступ к полям объекта через методы (без замыкания)
for(var i = 0; i < loops; i++) { t3.x1 = i; t2.x2 = i + 5; sum -= t2.sum; } //доступ к внутренним переменным через свойства с замыканиями.
Своя игра с JavaScript и Canvas