Этот пост в блоге является частью 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.