Можно ли смоделировать абстрактный базовый класс в JavaScript? Как это сделать наиболее элегантно?
Скажем, я хочу сделать что-то вроде: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
Он должен выводить: "лай", "мяу".
javascript
oop
abstract
Sabya
источник
источник
Ответы:
Один простой способ создать абстрактный класс:
Animal
«Класс» иsay
метод являются абстрактными.Создание экземпляра приведет к ошибке:
Вот как вы "наследуете" от него:
Dog
выглядит так же.И вот как разворачивается ваш сценарий:
Поиграйте здесь (посмотрите на вывод консоли).
источник
Классы JavaScript и наследование (ES6)
Согласно ES6, вы можете использовать классы JavaScript и наследование для выполнения того, что вам нужно.
Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
Прежде всего, мы определяем наш абстрактный класс. Этот класс не может быть создан, но может быть расширен. Мы также можем определить функции, которые должны быть реализованы во всех классах, расширяющих этот.
После этого мы можем создавать наши конкретные классы. Эти классы наследуют все функции и поведение от абстрактного класса.
И результаты ...
источник
Вы имеете в виду что-то вроде этого:
источник
whattosay
не определен в animal ), и что этот ответ четко спрашивает если предложенный ответ был тем, что искал спрашивающий. Он не претендует на то, чтобы дать решение для абстрактных классов в javascript. Спрашивающий не удосужился ответить мне или кому-либо еще, поэтому я понятия не имею, сработало ли это для него. Прошу прощения, если предложенный пятилетним ребенком ответ на чей-то вопрос не сработал для вас.Возможно, вы захотите проверить базовый класс Дина Эдвардса: http://dean.edwards.name/weblog/2006/03/base/
В качестве альтернативы есть этот пример / статья Дугласа Крокфорда о классическом наследовании в JavaScript: http://www.crockford.com/javascript/inheritance.html
источник
Безусловно. Существует около тысячи способов реализовать системы классов / экземпляров в JavaScript. Вот один из них:
Конечно, это не совсем абстрактный базовый класс. Вы имеете в виду что-то вроде:
источник
источник
Не гарантируется, что это будет работать как
__proto__
не является стандартной переменной, но работает, по крайней мере, в Firefox и Safari.Если вы не понимаете, как это работает, прочтите о цепочке прототипов.
источник
setPrototypeOf
метода, который мне понадобился бы для моего кода.Вы можете создавать абстрактные классы, используя прототипы объектов, простой пример может быть следующим:
Вы можете изменить вышеуказанный метод или нет, это зависит от вас, когда вы его реализуете. Для подробного наблюдения вы можете посетить здесь .
источник
Вопрос довольно старый, но я создал возможное решение, как создать абстрактный «класс» и заблокировать создание объекта этого типа.
Как видите, последний объект выдает ошибку, потому что у Animal в прототипе есть свойство
abstract
. Чтобы быть уверенным, что это Animal, а не то, что естьAnimal.prototype
в цепочке прототипов, я делаю:Поэтому я проверяю, что у моего ближайшего объекта-прототипа есть
abstract
свойство, только объект, созданный непосредственно изAnimal
прототипа, будет иметь это условие на true. ФункцияhasOwnProperty
проверяет только свойства текущего объекта, а не его прототипы, так что это дает нам 100% уверенность, что свойство объявлено здесь не в цепочке прототипов.В моем предложении нам не нужно менять
constructor
каждый раз после того,Object.create
как это в текущем лучшем ответе @ Jordão.Решение также позволяет создавать множество абстрактных классов в иерархии, нам нужно только создать
abstract
свойство в прототипе.источник
Еще одна вещь, которую вы, возможно, захотите применить, - это убедиться, что ваш абстрактный класс не создан. Вы можете сделать это, определив функцию, которая действует как функции ФЛАГА, установленные как конструктор абстрактного класса. Затем он попытается создать ФЛАГ, который вызовет свой конструктор, содержащий исключение, которое будет выдано. Пример ниже:
источник
Javascript может иметь наследование, проверьте URL-адрес ниже:
http://www.webreference.com/js/column79/
Андрей
источник
В
Factory
этом случае мы можем использовать шаблон проектирования. Javascript используетсяprototype
для наследования родительских членов.Определите конструктор родительского класса.
А затем создайте детский класс.
Затем определите конструктор дочернего класса.
Попробуй это.
Вот ссылка Codepen для полного примера кодирования.
источник
источник
Я думаю, что все эти ответы, особенно первые два ( некоторыми и jordão ), четко отвечают на вопрос с традиционной концепцией прототипа базовой JS.
Теперь, когда вы хотите, чтобы конструктор класса животных вел себя в соответствии с переданным параметром конструкции, я думаю, что это очень похоже на базовое поведение,
Creational Patterns
например, Factory Pattern .Здесь я немного попытался заставить это работать именно так.
источник
Animal
конструктор можно рассматривать как анти-шаблон, суперкласс не должен знать о подклассах. (нарушает принцип Лискова и открытия /источник
Если вы хотите убедиться, что ваши базовые классы и их члены строго абстрактны, вот базовый класс, который сделает это за вас:
Строгий режим делает невозможным регистрацию вызывающего объекта в методе throwAbstract, но ошибка должна возникать в среде отладки, которая покажет трассировку стека.
источник