Я нашел прототип наследования в javascript.
То, что я хотел достичь, - это набросок методов, которые при наследовании должны быть реализованы/определены.
Я хотел бы знать, возможно ли это, и если да, то как.
Я нашел прототип наследования в javascript.
То, что я хотел достичь, - это набросок методов, которые при наследовании должны быть реализованы/определены.
Я хотел бы знать, возможно ли это, и если да, то как.
У JavaScript действительно нет ничего подобного. Как вы сказали, JavaScript прототип ориентирован.
Как говорили другие ответы, конечно, вы можете имитировать это. Но я не вижу достаточной причины для этого. Почему объектно-ориентированные программисты используют интерфейсы и абстрактные классы? Astraction и decoupling. Они позволяют делать всевозможные приятные вещи, такие как методы записи, которые потребляют (принимают в качестве аргументов) и производят (возвращают) значения, которые имеют абстрактные типы - объекты, которые, по крайней мере, удовлетворят некоторый контракт относительно его методов и полей.
В свою очередь, мы получаем другие "приятные вещи", такие как проверки времени компиляции для безопасности типов. Попробуйте передать объект типа Foo
методу, который принимает только объекты типа Bar
*, и вы получите предупреждение компилятора.
prototype
или constructor
после создания (read: new
), вы можете изменить свойства объекта.Похоже, вы пытаетесь навязать относительную жесткость строго типизированных объектно-ориентированных языков на системе динамического типа JavaScript "relaxed, go-in-flow". ИМХО, это не отличная идея. Может быть, вы могли бы объяснить фактическую проблему, которую пытаетесь решить?
Извините, если это длинный, rant-y или некогерентный. Я уверен, что там есть хотя бы один язык (OCaml?), который полностью меняет ключ в моей логике. Бросьте мне обратную связь.
* Предполагая, что Foo
не является подтипом Bar
, конечно.
†... но только во время выполнения, поэтому на самом деле это не более чем гарантия, чем то, что вы уже получили с системой типа JavaScript.
‡ возможно,
Javascript не поддерживает его из коробки, но легко смоделировать желаемую семантику. Если у вас есть базовый "класс", который вы хотите быть абстрактным, поместите метод (ы), который является (являются) абстрактными на нем, и попросите их выбросить ошибку. Если пользователь расширяет ваш "класс" и не обеспечивает реализацию, ошибка будет выбрана. Например, вы можете сделать
function Thing() {...}
Thing.prototype.abstractMethod = function() {
throw 'You must implement abstractMethod';
}