
Этот пост в блоге является частью 1 из 2.
Тайная жизнь предметов (часть 1)
При изучении JavaScript я столкнулся с несколькими препятствиями. Одной из самых больших проблем была шестая глава Eloquent JavaScript. Я прошел главы 1–5 до того, как начал буткемп Flatiron, но дойти до этой главы было все равно, что врезаться в стену.
Когда я впервые наткнулся на эту главу, я еще не начал изучать Ruby и, конечно же, не имел опыта работы с классическими шаблонами ООП в таких языках, как Java. Даже после изучения Ruby я так и не смог освоить эту главу.
Вместо этого я познакомился с таким материалом, как JavaScript: лучшие стороны. Автор Дуглас Крокфорд подчеркивает противоречие в JavaScript между его прототипической природой и некоторым синтаксисом, основанным на классах:
JavaScript сам по себе не уверен в своей прототипической природе, поэтому предлагает синтаксис создания объектов, напоминающий классические языки. Немногие классические программисты считают прототипное наследование приемлемым, а классический синтаксис скрывает истинную прототипную природу языка. Это худшее из обоих миров.
Итак, когда я впервые начал работать над упражнениями в главе 6, мне не хотелось практиковать синтаксис класса.
За последние несколько месяцев я начал изучать язык программирования Java. Я также получил больше практики с наследованием прототипов JavaScript. Я думаю, что это дало мне больше понимания классического ООП и более глубокое понимание JavaScript.
Векторный тип
Красноречивый JavaScript объясняет концепцию этой задачи. Подводя итог, мне нужно было создать класс Vec с конструктором, несколькими методами и геттером.
Вот мое решение:
class Vec {
constructor(x, y) {
this.x = x;
this.y = y;
}
coordinates() {
console.log(`Coordinates ${this.x} and ${this.y}`);
}
plus(vec) {
return new Vec(this.x + vec.x, this.y + vec.y);
}
minus(vec) {
return new Vec(this.x - vec.x, this.y - vec.y);
}
get length() {
return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2))
}
}
Уроки выучены
Самым сложным в решении этой проблемы было просто принять классический синтаксис. Как только я попробовал, было относительно легко создать конструктор и методы.
Группы
Второе упражнение в шестой главе требует создания класса Группа, смоделированного по образцу нативного объекта Set JavaScript.
Вот что я придумал:
class Group {
constructor(arr) {
this.entries = [];
}
add(val) {
if (!(this.has(val))) {
this.entries.push(val);
}
}
delete(val){
if ((this.has(val))) {
this.entries.splice(this.entries.indexOf(val), 1);
}
}
has(val){
return this.entries.includes(val)
}
static from(arr) {
let newGroup = new Group();
for (let i = 0; i < arr.length; i++) {
newGroup.add(arr[i]);
}
return newGroup;
}
}
Уроки выучены
Эта проблема была немного сложнее. Изначально я пытался сделать каждую запись в группе символом. Этот подход не работал, поэтому я решил просто создать свойство entries, которое по умолчанию равно пустому массиву. Как только я сделал это переключение, все остальное встало на свои места довольно быстро.
Спасибо, за то что прочитали эту статью. В следующем посте этой серии я расскажу о своих решениях для последних двух упражнений этой главы.
Первоначально опубликовано на https://www.edezekiel.com.