Здесь есть около сотни терминологических проблем, в основном построенных вокруг кого-то (не вас), пытающегося сделать свою идею похожей на The Best.
Все объектно-ориентированные языки должны уметь работать с несколькими понятиями:
- инкапсуляция данных вместе со связанными с ними операциями над данными, по-разному известными как элементы данных и функции-члены, или как данные и методы, среди прочего.
- наследование, способность сказать, что эти объекты точно такие же, как и другой набор объектов, КРОМЕ этих изменений
- полиморфизм («много форм»), в котором объект сам решает, какие методы следует запустить, чтобы вы могли зависеть от языка для правильной маршрутизации ваших запросов.
Теперь, что касается сравнения:
Во-первых, это вопрос "класса" против "прототипа". Идея изначально возникла в Simula, где с помощью метода на основе классов каждый класс представлял набор объектов, которые разделяли одно и то же пространство состояний (читайте «возможные значения») и одни и те же операции, формируя таким образом класс эквивалентности. Если вы посмотрите на Smalltalk, так как вы можете открыть класс и добавить методы, это практически то же самое, что вы можете сделать в Javascript.
Позже ОО-языки хотели использовать статическую проверку типов, поэтому мы получили понятие фиксированного класса, установленного во время компиляции. В открытой версии у вас было больше гибкости; в более новой версии у вас была возможность проверить некоторые виды корректности в компиляторе, которые в противном случае потребовали бы тестирования.
На языке «классов» это копирование происходит во время компиляции. В языке прототипа операции хранятся в структуре данных прототипа, которая копируется и изменяется во время выполнения. Однако, абстрактно, класс по-прежнему является классом эквивалентности всех объектов, которые используют одно и то же пространство состояний и методы. Когда вы добавляете метод к прототипу, вы фактически создаете элемент нового класса эквивалентности.
Теперь, зачем это? прежде всего потому, что он обеспечивает простой, логичный, элегантный механизм во время выполнения. Теперь, чтобы создать новый объект, или , чтобы создать новый класс, вам просто нужно выполнить глубокое копирование, копируя все данные и структуру данных прототипа. Вы получаете наследование и полиморфизм более или менее бесплатно: поиск метода всегда состоит из запроса словаря для реализации метода по имени.
Причина, по которой появился сценарий Javascript / ECMA, заключается в том, что, когда мы начинали с этим 10 лет назад, мы имели дело с гораздо менее мощными компьютерами и гораздо менее сложными браузерами. Выбор метода на основе прототипа означал, что интерпретатор может быть очень простым при сохранении желаемых свойств ориентации объекта.