Dark_Knight
@Dark_Knight
Game Dev

Как созадть интерфейс в JavaScript?

Здравствуйте, подскажите и объясните пожалуйста.
Я понимаю, что в js нет интерфейсов, так как в этом языке нет классов, а все строится на объектах и прототипах, которые в свою очередь не могут быть строго типизированными(пожалуйста, поправьте, если я ошибаюсь).
Но все же, будьте добры и объясните, что такое интерфейс? Желательно на примере javascript(имею в виду, как его можно сэмулировать сугубо в теоретических целях на этом языке).
И верно ли, что самой близкой эмуляцией интерфейса в JavaScript являются абстрактные классы ?
Спасибо за помощь и ваше время.
  • Вопрос задан
  • 20661 просмотр
Пригласить эксперта
Ответы на вопрос 4
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
JS динамический язык с утиной типизацией. Собственно как в Ruby или Python. Наследование в нем реализуется через объекты и прототипы объектов. То есть места интерфейсу тупо нету.

Грубо говоря, если допустить наличие "классов" в JS, то интерфейсом будет как раз таки абстрактный класс, у которого реализация всех методов выбрасывает ошибку not implemented. Во всяком случае люди которые еще не отвыкли писать интерфейсы на все и вся в Python или Ruby так обходятся.

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

function can(obj, methodName) {
     return ((typeof obj[methodName]) == "function");
}

// вот так вот сурово мы подаем вместо объекта словарь!
var dict = {
   quack: function () {
       console.log('Quack! Quack!');
   }
}

// метод требует объект реализующий метод quack
function test(obj) {
    if(!can(obj, 'quack')) { throw "Object should implement quack method" }
    obj.quack();
}
Ответ написан
RubaXa
@RubaXa
Хотите интерфейсы, используйте TypeScript
Ответ написан
Комментировать
titulusdesiderio
@titulusdesiderio
IT-специалист
Интерфейс - способ "объявить" метод, но вынести его реализацию за рамки объекта/класса/модуля/всего_проекта/

Чаще всего используется в случаях, когда вариантов реализации метода over9000 и/или требуется динамически изменять код метода, сохраняя остальной код/объект неизменным.

Сергей Протько более чем прав по поводу DuckTyping в JavaScript. Так что нет смысла пытаться повторять статическую типизацию из Java и проверять наличие методов во время создания. Правда мне претит идея вставлять такие If вручную в каждой строке использования метода "интерфейса". У меня есть библиотека реализующая и немного расширяющая данный подход.

jsInteface - это реализация классческих ООП интерфейсов на Javascript с поправкой на его динамическую природу.
Эта библиотека
  • во-первых проверяет наличие у имплементации метода в момент его вызова
  • во-вторых подменяет this имплементации интерфейса на this владельца интерфейса
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы