Как инициализировать свойства в конструкторе Javascript - PullRequest
0 голосов
/ 24 сентября 2011

Я играю с html5 canvas, чтобы создавать прыгающие шары.У меня все это работает, но я должен вызвать функцию инициализации, чтобы установить определенные свойства.Как я могу сделать это автоматически в конструкторе без запуска инициализатора при обращении к свойствам?

var test1 = new Ball(20);
test1.setAngleAndVelocity(); //I dont want to have to call this.

function Ball(speed){
    this.position = new Vector2(canvas.width / 2, canvas.height / 2);
    this.velocity;
    this.speed = speed;
    this.angle;
    this.setAngleAndVelocity = function(){
        this.angle = Math.floor(Math.random() * 360) * 0.0174532925;
        this.velocity = new Vector2(this.speed/10 * Math.cos(this.angle), this.speed/10 * Math.sin(this.angle));
    }
}

Ответы [ 2 ]

4 голосов
/ 24 сентября 2011

Поскольку setAngleAndVelocity() является статическим методом, я бы рекомендовал поместить его в прототип вашего Ball класса:

function Ball(speed){
    this.position = new Vector2(canvas.width / 2, canvas.height / 2);
    this.speed = speed;
    this.setAngleAndVelocity(); //Sets the additional values
}
Ball.prototype.setAngleAndVelocity = function(speed){
    speed = typeof speed != "undefined" ? speed : this.speed;
    this.angle = Math.floor(Math.random() * 360) * 0.0174532925;
    this.velocity = new Vector2(speed/10 * Math.cos(this.angle), speed/10 * Math.sin(this.angle));
}

this.velocity; и this.angle; не обязательны: они ничего не определяют, и они служат только для того, чтобы показать разработчику, какие свойства могут быть определены.

После этих модификаций ваш скрипт стал более эффективным и может использоваться следующим образом:

var test1 = new Ball(20); //Inititalized
test1.setAngleAndVelocity(22); //Optional, a method to adjust the speed value after the init of the class.
1 голос
/ 24 сентября 2011

Просто вставьте это вычисление в конструктор.

function Ball(speed){
    this.position = new Vector2(canvas.width / 2, canvas.height / 2);
    this.speed = speed;
    this.angle = Math.floor(Math.random() * 360) * 0.0174532925;
    this.velocity = new Vector2(this.speed/10 * Math.cos(this.angle), this.speed/10 * Math.sin(this.angle));
}

ADDENDUM

Если вы хотите сохранить функцию для обновления угла и скорости в другое время в вашем приложении поместите эту функцию в прототип:

Ball.prototype.changeSpeed = function (newSpeed) {
    this.speed = newSpeed;
    this.velocity = new Vector2(this.speed/10 * Math.cos(this.angle), this.speed/10 * Math.sin(this.angle));
}

Вы можете вызвать этот метод из конструктора, если хотите:

function Ball(speed){
    this.position = new Vector2(canvas.width / 2, canvas.height / 2);
    this.angle = Math.floor(Math.random() * 360) * 0.0174532925;
    this.changeSpeed(speed);
}

См. http://jsfiddle.net/FnHLX/ для рабочего примера.

Вы также можете написать аналогичную функцию для изменения угла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...