"Класс" Дизайн в JavaScript


Я программист систем самообучения на JavaScript. Прототипным наследованием является совершенно новым для меня, так что я мог бы использовать некоторые советы лучшие практики здесь.

Я сделал простую игру (арканоид) для моего первого проекта. Вот простой пример объект игры.

function GameObject(sprite) {
    this.xVelocity = 0;
    this.yVelocity = 0;
    this.x = 0;
    this.y = 0;
    this.sprite = sprite;
    this.__defineGetter__('width', function() {
        return sprite.width;
    });
    this.__defineGetter__('height', function() {
        return sprite.height;
    });
    this.__defineGetter__('rect', function() {
        return {
            left   :this.x,
            top    :this.y,
            right  :this.x + this.width,
            bottom :this.y + this.height
        };
    });
}

Каждый объект имеет ассоциированный спрайт и сказал, спрайт определяет ширину и высоту объекта. Поэтому, приходя из C++, я определил несколько геттеров, которые зависят от спрайта.

Любой и все советы явно оценил. Надеюсь, этот пример не слишком тривиально.



Комментарии
1 ответ

Не было никакого стандарта для того, как определить геттеры и сеттеры в JavaScript до недавнего времени, поэтому реализация различных синтаксисов, и не очень похоже на работу в браузере... в defineGetter метод помечен как нестандартные и устаревшие.

Дело в том, что надежно работает сейчас, это не использовать сеттеры и геттеры, но методы, которые им указывают на то, что они делают (так же как это сделано в Java).

(Конечно, если он вам нужен только для работы в конкретном браузере, вы можете использовать любой синтаксис там работает. Есть некоторые примеры синтаксиса в тестовый код, что я связан с выше.)

Использовать прототипная интерфейса, поставить методов в прототипе, а не в экземпляре объекта:

function GameObject(sprite) {
this.xVelocity = 0;
this.yVelocity = 0;
this.x = 0;
this.y = 0;
this.sprite = sprite;
}

GameObject.prototype = {

get_width: function() {
return sprite.width;
},
get_height: function() {
return sprite.height;
},
get_rect: function() {
return {
left :this.x,
top :this.y,
right :this.x + this.width,
bottom :this.y + this.height
};
}

};

2
ответ дан 14 ноября 2011 в 10:11 Источник Поделиться