Определить метод класса и экземпляра в javascript

Я хочу иметь доступ к методу как из экземпляра, так и из класса:

class AClass {
  // I want to make this both static and normal
  method() {
    console.info("Method called");
  }
}

Я бы ожидал, что смогу получить доступ к методам static из экземпляра (как в python с @staticmethod), но я не могу, так как выдает ошибку:

class AClass {
  static method() {
    console.info("Method called");
  }
}

AClass.method();  // this works
(new AClass).method();  // this doesn't work

Похожие вопросы

  • Вызов статических методов из обычных методов класса ES6 Этот вопрос не является дубликатом этого вопроса, потому что я хочу, чтобы одно и то же имя было как для статического метода, так и для метода экземпляра. Этот вопрос касается вызова статического метода из метода экземпляра (другое имя)

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

MarcellPerger 11.04.2023 20:32

@MarcellPerger, тогда просто назовите их одинаково?

VLAZ 11.04.2023 20:38

Итак, почему бы просто не присвоить свойство экземпляру в конструкторе? constructor() { this.method = AClass.method; }

JDB 11.04.2023 21:28

Если у меня есть много статических методов для объекта, конструктор может стать очень длинным, и я бы предпочел сохранить каждую функцию в одной области кода, но это все же лучше, чем ничего.

MarcellPerger 11.04.2023 21:35

«(new AClass).method();, это не работает» — это не должно работать. Зачем вам вызывать статический метод, не связанный с экземплярами, для экземпляра? JavaScript — это не Java, просто используйте AClass.method(), который работает. Если очень нужно, (new AClass).constructor.method().

Bergi 11.04.2023 22:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте нестатический метод с тем же именем и вызовите статический метод из нестатического метода.

class AClass {
  static method() {
    console.info("Method called");
  }
  method() {
    AClass.method();
  }
}

AClass.method();  // this works
(new AClass).method();  // this now works

Это почти то же самое, что ответ Берхи здесь , но с той существенной разницей, что это хуже, поскольку не будет уважать наследование. Рассмотрим class A { static method() { /* logic for a */ } }, а затем class B extends A { static method() { /* logic for B */} } При прямом вызове статического метода из A метод, определенный в B, будет проигнорирован. В то время как с this.constructor.method() будет использоваться дочерний метод, если таковой имеется. Демо: jsbin.com/wucaxifali/1/edit?js,консоль

VLAZ 12.04.2023 11:51

Я уже ответил на вопрос дубликатом. Этот комментарий был критикой ответа, указывающего на недостаток, который уже устранен в дубликате. Говоря о: избегайте дубликатов ответов.

VLAZ 12.04.2023 15:24

Другие вопросы по теме