Правильный способ передачи области видимости импортированному классу

#javascript

#javascript

Вопрос:

Допустим, у меня есть класс, такой как следующий. Подходит ли передача this для импортированного класса? Или есть лучший способ получить доступ к области родительского класса?

 import Fruit from 'fruit'

export default class Banana {
  constructor () {
    this.color = 'yellow'
  }
  let length = new Fruit(this).getLength()
}
  
 export default class Fruit {
  constructor(scope) {
    this.parentScope = scope 
  }

  getLength() {
    if (this.parentScope.color == 'yellow') {
      return 5
    }
  }
}
  

Есть ли лучший способ?

Комментарии:

1. В этом случае вам действительно нужно передать область видимости, когда все общедоступные свойства класса уже доступны через его объект. Какую пользу принесет передача области видимости?

2. @Saksham Не могли бы вы показать мне, как получить доступ к общедоступным свойствам из Fruit?

3. let length = new Fruit(this).getLength() недопустимо там, где это в вашем первом примере, поэтому трудно дать какой-либо совет.

4. Мне также неясно, что вы подразумеваете под «областью видимости родительского объекта», потому что «область видимости» имеет конкретное значение, но здесь это не применимо. Но я согласен с Фродо, что вы, вероятно, хотите наследования.

5. @FelixKling недействителен? Это определенно работает… я бы сказал, это просто неправильно, но да, я думаю, что наследование здесь является ответом.

Ответ №1:

Да, сэр, есть лучший способ, он называется наследованием классов. Вы хотите, чтобы ваш класс banana расширял класс fruit. Таким образом, они оба являются одним и тем же объектом, и ваш banana наследует все методы и свойства класса fruit .

 export default class Banana extends Fruit {
  

https://javascript.info/class-inheritance

Ответ №2:

Я думаю, что есть несколько концепций, которые вам не хватает, которые я исправил, внеся наименьшие изменения в ваш код

 class Fruit {
  getLength(color) {
    if (color == 'yellow') {
      return 5;
    }
  }
}

class Banana {
  constructor() {
    this.color = 'yellow';
    let length = (new Fruit()).getLength(this.color);
    alert(length);
  }
}

let aFruit = new Banana();
  

Основная часть заключается в том, что вместо передачи всей области видимости вы можете передать только цвет объекта Banana.

Если у вас действительно есть что-то общее с родительской областью видимости, попробуйте расширить дочерний класс из родительского.