Проблема наследования классов для ES 6 JS и ее неудачные тесты - PullRequest
0 голосов
/ 22 февраля 2019

Я новый разработчик из Ruby.В последнее время я очень усердно работал в JS, и у меня возникли некоторые проблемы с наследованием классов в новой ES 6. Я чувствую, что это может быть проблемой с моим пониманием JS или с тем, чтобы связать его с Ruby.Я пытался перевести Ruby Project в JS на практике, но сейчас я проваливаю проверку возможностей.

Неудачный тест возможностей при попытке инициализировать два экземпляра класса

const STATS = { str:1, dex:1, int:1 }

class Example {
  constructor(race, clas) {
    this.race = race,
    this.clas = clas,
    this.stats = this.add(STATS)
  }
  
  add(stats) {
    if(this.race != 'empty'){
      stats.str += this.race.str
      stats.dex += this.race.dex
      stats.int += this.race.int
    }
    if(this.clas != 'empty') {
      stats.str += this.clas.str
      stats.dex += this.clas.dex
      stats.int += this.clas.int
    } 
    return stats
  }
}

var a = new Example({str: 1, dex:0, int:0}, 'empty');
var b = new Example('empty', {str: 0, dex:0, int:1});

console.log('Should be str:2 dex:1 int:1');
console.log(a.stats); 
console.log('Should be str:1 dex:1 int:2');
console.log(b.stats);

Мой класс имеет функции, которые изменяют состояние при создании, но проблема заключается в том, что каждый раз, когда вызывается новый класс, он сохраняет изменения из предыдущей переменной.Это - только проблема в моем тесте функций, поскольку это единственный раз, когда класс вызывается дважды.

Это ссылка на мой тест функций https://github.com/RyanWolfen7/jsRPG/blob/master/cypress/integration/featureTest/characterFeature_test.js

И это класс, которыйпровал тестов https://github.com/RyanWolfen7/jsRPG/blob/master/models/characters/character.js

Честно говоря, я, вероятно, собираюсь отказаться от своего проекта и начать все сначала, но я хотел бы понять, в чем моя проблема.Я использовал подход OOD к JS и переводил свой проект ruby ​​https://github.com/RyanWolfen7/ruby_rpg на JS.Я не уверен, что это потому, что я написал тест неправильно или из-за глубокого недопонимания того, как работает es-6.

Что я пробовал:

Создание нового объекта

Присвоение вновь созданного объекта новому классу

1 Ответ

0 голосов
/ 22 февраля 2019

Это не проблема наследования.На самом деле это никак не связано с ОО.То, что вы видите, является результатом того факта, что большинство вещей в javascript являются ссылками (указателями), но вы пишете код, как будто STATS является значением.

В вашей функции add вы делаете это:

add(stats) {
  if(this.race != 'empty'){
    // modifying passed in object, not creating new object
    stats.str += this.race.str
    stats.dex += this.race.dex
    stats.int += this.race.int
  }
  if(this.clas != 'empty') {
    // modifying passed in object, not creating new object
    stats.str += this.clas.str
    stats.dex += this.clas.dex
    stats.int += this.clas.int
  } 
  return stats
}

Поэтому независимо от того, сколько раз вы вызываете add(), и с любого экземпляра Example, который вы вызываете, вы только получаете доступ и перезаписываете один общий STATS объект.

Чтобы создавать новые копии STATS при каждом вызове функции, вам необходимо скопировать его в новый объект.Самый быстрый способ старой школы - это сериализовать объект в строку, а затем преобразовать строку обратно в объект:

add (input) {
  var stats = JSON.parse(JSON.stringify(input));

  // ...
}

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

Современный javascript может сделать это, используя Object.assign:

add (input) {
  var stats = Object.assign({},input);

  // ...
}

Однако я не знаю, работает ли он быстрее.Вы должны будете сравнить его самостоятельно.Вы можете погуглить фразу "js clone object" для получения дополнительной информации.

...