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

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

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


person Community    schedule 19.01.2010    source источник
comment
отметьте как вики сообщества, пожалуйста ..   -  person Gabriele Petrioli    schedule 19.01.2010
comment
Является ли создатель JavaScript пользователем Stackoverflow?   -  person André Pena    schedule 19.01.2010
comment
@Gaby - Где-то там есть ответ.   -  person ChaosPandion    schedule 19.01.2010
comment
@ Андре Брендан Эйх? - вы можете найти его / users /   -  person alex    schedule 19.01.2010
comment
у меня вопрос: почему больше языков не используют прототипное наследование?   -  person Jimmy    schedule 19.01.2010
comment
@Alex: Лол, я видел, но похоже, что его нет рядом :)   -  person André Pena    schedule 19.01.2010
comment
stackoverflow.com/questions/1024171/   -  person Mauricio Scheffer    schedule 19.01.2010


Ответы (5)


Вот что Брендан Эйх говорит о том, что произошло: https://brendaneich.com/2008/04/popularity/

Как я часто говорил и как могут подтвердить другие в Netscape, меня наняли в Netscape с обещанием выполнять Scheme в браузере. По крайней мере, руководство клиентской инженерии, включая Тома Пэкуина, Майкла Тоя и Рика Шелла, а также парня по имени Марк Андриссен, были убеждены, что Netscape должна встраивать язык программирования в исходную форму в HTML.

Диктат высшего инженерного руководства заключался в том, что язык должен выглядеть как Java. Это исключало Perl, Python и Tcl, а также Scheme.

Я не горжусь, но я счастлив, что выбрал первоклассные функции Scheme-ish и самоподобные (хотя и единичные) прототипы в качестве основных ингредиентов. Влияние Java, особенно ошибки даты y2k, а также различие между примитивом и объектом (например, строка и строка), были неудачными.

person Community    schedule 17.03.2010

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

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

person noah    schedule 19.01.2010
comment
Что вы имеете в виду, говоря, что нет изменяемого состояния, что означает отсутствие изменяемых объектов? - person André Pena; 19.01.2010
comment
@Andre: В чистом функциональном программировании (например, в Erlang) все переменные являются константами. Значения, которые они содержат, не могут быть изменены после создания переменной. Поскольку мы обращаемся к объектам с помощью переменных, это означает, что объекты в чистом FP ​​не могут быть изменены: все объекты являются константами. - person slebetman; 19.01.2010
comment
Хорошо, но в javascript, что, если я сделаю это: var a = {name = n, age = 1}. a.age = 2. Что я делаю? повторное создание экземпляра 'a'? - person André Pena; 19.01.2010
comment
@Andre Я хотел сказать, что JavaScript ослабляет правила и допускает изменяемое состояние, но, поскольку он берет свое начало в FP, прототипное наследование имеет своего рода смысл, поскольку позволяет расширять объект, сохраняя исходный неизменным. - person noah; 19.01.2010
comment
Lisp имеет изменяемое состояние; неизменность не имеет ничего общего с прототипным наследованием. - person Sean McMillan; 28.06.2011

Потому что на него сильно повлиял Я. Об этом говорится в Википедии и спецификации ECMA.

person Christoph    schedule 19.01.2010

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

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

person x4u    schedule 19.01.2010

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

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

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

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

person pestilence669    schedule 19.01.2010
comment
@Pestilence, не могли бы вы указать мне на какие-нибудь ресурсы, чтобы я мог делать то, о чем и не мечтали? Например, с миксами я могу получить методы от объекта, установив для него свой прототип, но я могу сделать это только один раз, верно? Если мне не нужны прототипы, например: - У меня есть объект X, я хочу, чтобы он обладал Y.doSomething - X.doSomething = Y.doSomething - (который просто устанавливает ссылку на Y.doSomething, правда? Что, если я хочу, чтобы это было независимо) - person ambertch; 21.01.2010
comment
Что ж, эмулировать наследование классов - это то, что вы можете сделать ... Но вам действительно не нужно беспокоиться об иерархиях в динамически типизированном языке. Просто клонируйте один или несколько ваших прототипов в новый экземпляр. Вот что вы можете сделать: динамическое создание классов и экземпляров путем добавления методов и инициализаторов из других классов. Программное изменение интерфейса во время строительства. Даже изменение базовых классов. Мне нравится изменять все строковые объекты для включения методов Base64: foo.base64 (). - person pestilence669; 22.01.2010
comment
Атрибут прототипа, о котором вы говорите, может считаться необязательным для пользовательских классов. Вы можете взять под свой контроль и полностью его обойти. - person pestilence669; 22.01.2010
comment
Это достойное описание различных способов построения классов в JS: ruzee.com/blog/2008/12/ Обратите внимание на то, как он создает и расширяет (в потоке). Я не думаю, что в то время, когда был создан JS, этот шаблон проектирования существовал. - person pestilence669; 22.01.2010