Почему JavaScript был реализован с использованием прототипального наследования?
Есть много статей и сообщений, объясняющих, как работает наследование JavaScript, но почему был реализован JavaScript с использованием прототипального наследования вместо классического наследования?
Я обожаю JavaScript, поэтому я не говорю это плохо... Мне просто интересно.
Ответы
Ответ 1
Здесь, что Брендан Эйч должен сказать о том, что произошло:
http://weblogs.mozillazine.org/roadmap/archives/2008/04/popularity.html
Как я часто говорил, и, как утверждают другие в Netscape, я был завербован в Netscape с обещанием "сделать схему" в браузере. По крайней мере, клиентское инженерное управление, включая Тома Пакина, Майкла Тойка и Рика Шэлла, вместе с каким-то парнем по имени Марк Андрессен, было убеждено, что Netscape должен внедрить язык программирования в исходной форме в HTML.
Диктат высшего инженерного менеджмента заключался в том, что язык должен "выглядеть как Java". Это исключало Perl, Python и Tcl вместе с Scheme.
Я не горжусь, но я рад, что в качестве основных ингредиентов я выбрал первоклассные функции Scheme-ish и Self-ish (хотя и исключительные) прототипы. Влияние Java, особенно ошибки y2k Date, но также и примитивное и объектное различение (например, строка против String), были неудачными.
Ответ 2
Если один из разработчиков JavaScript не остановится, чтобы взвесить, мы можем только догадываться. Это было сказано, здесь я беру:
JavaScript выполняется, поскольку он интерпретируется, поэтому нет понятия разделения объявления типа объекта из самого объекта. Это очень функциональный подход. Экземпляр появляется, как он описывается, - мы всегда работаем на активных экземплярах. Из-за этого понятие класса - или пассивного шаблона экземпляра - не имеет реального места.
Ответ 3
JavaScript изначально предполагался очень похож на Lisp. Даже после того, как синтаксис был изменен для более близкого сходства с C/Java, он по-прежнему Lisp в одежде C.. Я думаю, что ответ кроется в его функциональном программировании. В чистом FP нет изменчивого состояния, что означает отсутствие изменчивых объектов. Если вы немного ослабляете правила и немного креативны, вы получаете что-то вроде наследования на основе имени, т.е. Вы можете расширять объекты, но не изменять исходный объект. Он обеспечивает ту же силу, что и наследование, и все же дает вам некоторую неизменность.
Наконец, закрутите язык вокруг, чтобы он выглядел как С++ и Java, и viola, у вас есть new someFunction()
, а остальная часть - история.
Ответ 4
Потому что это сильно зависело от Я. Об этом говорят и Википедия, и ECMA-spec.
Ответ 5
Я думаю, что он был выбран потому, что его легко реализовать, не требует дополнительных ключевых слов, и пользователям не нужно понимать его, чтобы иметь возможность использовать этот язык. Он также более мощный и гибкий, чем наследование на основе классов.
Это естественный выбор для нетипизированного языка. Основными преимуществами наследования на основе классов являются то, что он позволяет статическую типизацию и, таким образом, проверять тип и более быструю реализацию поиска на основе таблиц.
Ответ 6
Прототипическое наследование (с закрытием) позволяет другим делать то, что никогда не предполагалось. Это совокупность нескольких парадигм, которые собрались вместе для достижения программирования общего назначения.
С языком прототипа вы можете иметь "mix-ins" для своих классов. Вы можете выполнить уровень инкапсуляции, который вы желаете, без ключевых слов, специфичных для языка. Короче говоря, языки прототипов удивительны.
Мне очень жаль это говорить, но JavaScript, а также некоторые библиотеки, могут делать все, в чем я нуждаюсь. Это было подрывным в своем развитии (предполагается, что оно подчинено Java). Он имеет большую мощность в простейших реализациях.
С достаточным изучением/игрой, вы начнете видеть преимущества этого вдохновения. JavaScript является одним из немногих языков, которые "спрятали" его потенциально намеренно. Вы должны войти в политику, если хотите узнать "почему". Но, по этой причине, это потрясающе.