Почему JavaScript был реализован с использованием прототипного наследования? - PullRequest
13 голосов
/ 19 января 2010

Есть много статей и постов, объясняющих, как работает наследование JavaScript, но почему JavaScript был реализован с использованием наследования прототипов вместо классического наследования?

Мне нравится JavaScript, поэтому я не говорю, что это плохо ..Мне просто любопытно.

Ответы [ 6 ]

15 голосов
/ 17 марта 2010

Вот что Брендан Айх должен сказать о том, что произошло: 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, а также различия между примитивами и объектами (например, строка против строки), оказались неудачными.

12 голосов
/ 19 января 2010

Если только один из разработчиков JavaScript не остановится, мы можем только догадываться.Как было сказано, вот мое мнение:

JavaScript выполняется в том виде, в каком он интерпретируется, поэтому нет концепции отделения объявления типа объекта от самого объекта.Это очень функциональный подход.Экземпляр создается так, как его описывают - мы всегда работаем с активными экземплярами.Из-за этого концепция класса - или пассивный «шаблон экземпляра» - не имеет реального места.

8 голосов
/ 19 января 2010

JavaScript изначально должен был быть очень похож на Лисп. Даже после того, как синтаксис был изменен, чтобы больше походить на C / Java, он все еще Lisp в одежде C . Я думаю, что ответ заключается в происхождении функционального программирования. В чистом FP ​​нет изменяемого состояния, что означает отсутствие изменяемых объектов. Если вы немного ослабите правила и проявите немного творчества, вы получите нечто вроде наследования прототипа, то есть вы можете расширять объекты, но не изменять исходный объект. Он предоставляет ту же силу, что и наследование, и все же дает вам некоторую неизменность.

Наконец, измените язык, чтобы он выглядел как C ++ и Java, и альт, у вас есть new someFunction(), а остальное - история.

5 голосов
/ 19 января 2010

Потому что это было под сильным влиянием Самости. Об этом упоминают и Википедия, и спецификация ECMA.

1 голос
/ 19 января 2010

Прототипическое наследование (с замыканиями) позволяет другим делать то, что никогда не предполагалось. Это объединение нескольких парадигм, объединенных для достижения программирования общего назначения.

С языком-прототипом вы можете иметь «дополнения» для ваших классов. Вы можете достичь желаемого уровня инкапсуляции без ключевых слов для конкретного языка. Короче говоря, языки-прототипы потрясающие.

Мне неприятно это говорить, но JavaScript и некоторые библиотеки могут делать все, что мне нужно. Он был подрывным в своем развитии (должен подчиняться Java). Он имеет большую мощность в самых простых реализациях.

С достаточным обучением / тренировками вы начнете видеть преимущества его вдохновения. JavaScript - один из немногих языков, которые намеренно скрывали свой потенциал. Вы должны войти в политику, если хотите знать «почему». Но именно по этой причине это круто.

1 голос
/ 19 января 2010

Я думаю, что он был выбран, потому что его легко реализовать, не нужно никаких дополнительных ключевых слов и пользователям не нужно понимать его, чтобы иметь возможность использовать язык.Он также более мощный и гибкий, чем наследование на основе классов.

Это естественный выбор для нетипизированного языка.Основными преимуществами наследования на основе классов является то, что он позволяет статическую типизацию и, следовательно, проверку типов и более быструю реализацию поиска на основе таблиц.

...