javascript лучший способ создать объект с помощью метода, использующего функцию

#javascript #function #object #methods

#javascript #функция #объект #методы

Вопрос:

Я новичок в javascript и пытаюсь создать объект, экземплярами которого затем смогу заполнить список. Этот код, который у меня есть, работает, но кажется излишним использовать ключевое слово «this» в каждой строке. Есть ли более аккуратный / подходящий способ создать подобный объект?

Вот мой текущий объект:

     var Particle = function(x, y) {
    this.x = x;
    this.y = y;
    this.xspeed = 0;
    this.yspeed = 0;
    this.xacc = 0;
    this.yacc = 0;

    this.update = function() {
        this.x  = this.xspeed;
        this.y  = this.yspeed;
        this.xspeed  = this.xacc;
        this.yspeed  = this.yacc;
    }
}
  

Заранее спасибо за вашу помощь

Ответ №1:

К сожалению, this является обязательным в Javascript, даже если другие языки выводят это.

Сегодня классы Ecmascript поддерживаются любым браузером, за исключением IE. Это может быть хорошим способом использовать синтаксис класса, если вы хотите использовать объектно-ориентированное программирование.

 class Particle {
    constructor(x, y) {
      this.x = x;
      this.y = y;
      this.xspeed = 0;
      this.yspeed = 0;
      this.xacc = 0;
      this.yacc = 0;
    }

    update() {
        this.x  = this.xspeed;
        this.y  = this.yspeed;
        this.xspeed  = this.xacc;
        this.yspeed  = this.yacc;
    }
}

const particle = new Particle(1, 2);
particle.update();
console.log(particle);  

Комментарии:

1. Хотя мне немного грустно, что this. это обязательно, я не осознавал, что классы были доступны для использования подобным образом, это в значительной степени именно то, что я пытался эмулировать. Итак, спасибо за ответ, Бенджамин!

Ответ №2:

Вы могли бы использовать Object.assign и литерал объекта:

 var Particle = function(x, y) {
 Object.assign(this, {
   x, y,
   xspeed: 0,
   yspeed: 0,
   xacc: 0,
   yacc:0,
 });
 //...
};
  

Поскольку вы не используете наследование, вы также могли бы просто вернуть новый объект:

 const Particle = (x, y) => ({
   x, y,
   xspeed: 0,
   yspeed: 0,
   xacc: 0,
   yacc:0,
   update() {
    this.x  = this.xspeed;
    this.y  = this.yspeed;
    this.xspeed  = this.xacc;
    this.yspeed  = this.yacc;
  },
});
  

Комментарии:

1. Это действительно кажется более чистым, но в другом комментарии от Tino говорилось, что мой текущий метод имеет смысл, учитывая, что я хочу использовать несколько экземпляров с их собственными значениями. Означает ли это, что существуют различия в том, как переменные назначаются объекту для каждого из этих методов? Спасибо

2. @adam нет, не уверен, о чем он говорит.

3. ок, круто, спасибо, есть ли способ создать такого рода объект с помощью конструктора без использования объявления function ()? потому что использование стандартного присвоения object = {} кажется намного более чистым, но, похоже, оно не поддерживает конструкторы.

4. это здорово, я предпочитаю это методу function, большое спасибо за вашу помощь, Джонас.

Ответ №3:

О высоком использовании, которое this вы могли бы использовать Object.assign , чтобы исправить высокое использование присваивания значений в базовом коде. ( this.value = value )

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

Комментарии:

1. спасибо за ответ, я оставил комментарий к ответу Джонаса, спрашивающий о различиях между моим методом и методом object.assign, есть ли какие-либо?

2. Object.assign Функция будет привязывать значения к этой области, разницы в результате нет, Object.assign чище, и вы должны пойти на это. Я хотел сказать, что использование this области видимости в этом контексте не так уж плохо. ответ @Jonas отличный. Просто прочитайте мой ответ еще раз, он не совсем понятен, я отредактирую его