#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 отличный. Просто прочитайте мой ответ еще раз, он не совсем понятен, я отредактирую его