Тут існує близько сотні термінологічних питань, здебільшого побудованих навколо когось (не ви), який намагається зробити їхню ідею схожою на The Best.
Усі об'єктно-орієнтовані мови повинні вміти мати декілька понять:
- інкапсуляція даних разом із супутніми операціями над даними, широко відомими як члени даних та функції членів, або як дані та методи, серед іншого.
- успадкування, здатність сказати, що ці об'єкти так само, як і інший набір об'єктів ВСЕ, крім цих змін
- поліморфізм ("багато фігур"), в якому об'єкт вирішує сам, які методи слід запустити, щоб ви могли залежати від мови, щоб правильно направляти ваші запити.
Тепер, що стосується порівняння:
Перше - це питання "класу" проти "прототипу". Спочатку ідея почалася в Simula, де методом на основі класу кожен клас представляв собою набір об'єктів, які поділяють один і той же простір стану (читати "можливі значення") і ті ж операції, утворюючи тим самим клас еквівалентності. Якщо ви озираєтесь на Smalltalk, оскільки ви можете відкрити клас та додати методи, це фактично те саме, що ви можете зробити в Javascript.
Пізніше мови OO хотіли використовувати статичну перевірку типу, тому ми отримали поняття фіксованого класу, встановленого під час компіляції. У версії відкритого класу ви мали більше гнучкості; у новій версії ви мали можливість перевірити деякі види правильності у компіляторі, які в іншому випадку потребували б тестування.
Мовою "на основі класу" таке копіювання відбувається під час компіляції. Мовою прототипу операції зберігаються у структурі даних прототипу, яка копіюється та змінюється під час виконання. Однак, абстрактно, клас - це все-таки клас еквівалентності всіх об'єктів, які мають однаковий простір станів і методів. Додаючи метод до прототипу, ви ефективно створюєте елемент нового класу еквівалентності.
Тепер, навіщо це робити? насамперед тому, що він створює простий, логічний, елегантний механізм під час виконання. Тепер, щоб створити новий об'єкт або створити новий клас, вам просто потрібно виконати глибоку копію, копіюючи всі дані та структуру даних прототипу. Тоді ви отримуєте спадщину та поліморфізм більш-менш безкоштовно: пошук методу завжди полягає у запитанні словника щодо реалізації методу за назвою.
Причина, що опинилася в сценарії Javascript / ECMA, полягає в тому, що коли ми починали це 10 років тому, ми мали справу з набагато менш потужними комп'ютерами та набагато менш складними браузерами. Вибір методу, заснованого на прототипі, означав, що інтерпретатор може бути дуже простим, зберігаючи бажані властивості орієнтації об'єкта.