Наследование в Java Script - PullRequest
2 голосов
/ 29 мая 2019

У меня есть класс Person, как это:

 class Person {
    constructor(name, age, gender, interests) {
        Object.assign(this, {name, age, gender, interests});
    }
}

И я могу сделать подкласс вот так:

class Teacher extends Person {
    constructor(name, age, gender, interests, subject, grade) {
        super(name, age, gender, interests);
        Object.assign(this, {subject, grade});
    }
}

Но что, если я хочу создать подкласс, но не хочу наследовать все свойства от класса Person. Например, я не хочу наследовать собственность интересов. Должен ли я просто исключить это так:

class Student extends Person {
    constructor(name, age, gender, height, weight) {
        super(name, age, gender); // I haven't included the interests property here
        Object.assign(this, {height, weight});
    }
}

Я все еще новичок, поэтому я не уверен, является ли это хорошей практикой или нет. Хорошего дня!

Ответы [ 2 ]

4 голосов
/ 29 мая 2019
  super(name, age, gender); // I haven't included the interests property here

Не добавляя аргумент в вызов функции, параметр неявно будет неопределенным. Поэтому верхний равен:

 super(name, age, gender, undefined)

Следовательно, свойство interests все еще существует, оно просто undefined. Это действительно хорошее решение, если весь ваш код предполагает, что interests не может быть определено. Если нет, например если вы выполняете вычисления с ним без явной проверки, ваши вычисления могут внезапно стать NaN, что может привести к некоторым проблемам:

  if(person.age > 18) {
   alert("adult");
  } else alert("child"); // or maybe the person is not a child, and it's age property was just not set?

Теперь вместо того, чтобы установить в существующем свойстве значение, указывающее, что оно равно undefined, вы можете вообще пропустить свойство interests:

1) Перемещение в подкласс:

 class Person {
   constructor(name, age, gender) {
    Object.assign(this, {name, age, gender });
  }
 }

 class PersonWithInterests extends Person  {
   constructor(name, age, gender, interests) {
    super(name, age, gender);
    Object.assign(this, { interests });
  }
}

2) Создать миксин:

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

 const Interested = Super => class InterestMixin extends Super {
  constructor(args) { // passing in an object here makes the Mixin more flexible, all superclasses have to deal with it though
    super(args);
    this.interests = args.interests;
  }
};

class Animal { }

const PersonWithInterest = Interested(Person);
const AnimalWithInterest = Interested(Animal);

new PersonWithInterest({ name: "Jonas", interests: 10 })
new AnimalWithInterest({ type: "bear", interests: 20 })

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

4 голосов
/ 29 мая 2019

Наследование означает, что это значит ... вы наследуете то, что дает вам родитель.Так что «избегать атрибутов» не очень рекомендуется (и я не уверен, что вы даже можете это сделать).

Два решения:

  • Мудрая архитектура (которую я рекомендую): вваш конкретный случай, я бы просто поместил interests в класс Teacher.Если бы другие классы тоже имели interests, я бы создал подкласс типа PersonInterest, в котором Teacher наследовал бы от.
  • Код мудрый: вы устанавливаете interests в null илиundefined в классе, где он вам не нужен.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...