2008-10-09 3 views
207

Одним из основных преимуществ использования Javascript является то, что он основан на прототипе.Что значит, что Javascript - это прототип языка?

Но что это значит, что Javascript основан на прототипе, и почему это преимущество?

+2

Этот ответ объясняет все, что вам нужно знать о прототипном наследовании: http://stackoverflow.com/a/16872315/783743 – 2013-06-02 03:20:30

ответ

241

Прототипное наследование является формой объектно-ориентированного повторного использования кода. Javascript является одним из единственных [основных] объектно-ориентированных языков для использования прототипального наследования. Практически все другие объектно-ориентированные языки являются классическими.

В классическое наследование, программист пишет класс, который определяет объект. Несколько объектов могут быть созданы из одного класса, поэтому у вас есть код в одном месте, который описывает несколько объектов в вашей программе. Затем классы могут быть организованы в иерархию, что способствует повторному использованию кода. Более общий код хранится в классе более высокого уровня, из которого наследуются классы более низкого уровня. Это означает, что объект передает код другим объектам того же класса, а также его родительским классам.

В прототипного наследовании формы, объекты наследуют непосредственно от других объектов. Все дело о занятиях уходит. Если вы хотите объект, вы просто пишете объект. Но повторное использование кода по-прежнему ценно, поэтому объекты могут быть связаны друг с другом в иерархии. В javascript каждый объект имеет секретную ссылку на объект, который его создал, образуя цепочку. Когда объект запрашивается для свойства, которого у него нет, его родительский объект будет задан ... постоянно вверх по цепочке до тех пор, пока свойство не будет найдено или пока не будет достигнут корневой объект.

Каждая функция в JavaScript (которая сама по себе является объектом) фактически имеет элемент, называемый «прототипом», который отвечает за предоставление значений, когда объект запрашивается для них. Наличие этого элемента позволяет работать с конструкторским механизмом (по которому объекты строятся из функций). Добавление свойства в прототип объекта функции сделает его доступным для построенного объекта, а также для всех объектов, которые наследуются от него.

Преимущество

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

Sidenote:Hedges @ Андрей делает хороший момент, что есть на самом деле many прототипичные языков. Стоит отметить, что эти другие существуют, но также стоит отметить, что ни один из них не близок к мейнстриму. У NewtonScript некоторое время было какое-то тяговое усилие, но он умер со своей платформой. Также возможно расширить некоторые современные языки способами, которые добавляют прототипные возможности.

+6

Эй, Келли. Хотя JavaScript ** безусловно ** самый популярный прототипный язык, есть много других: http://en.wikipedia.org/wiki/Prototype-based_programming#Languages ​​ – 2008-10-09 08:53:37

+1

Эй, Эндрю. Хорошая точка зрения. Я должен был быть более ясным. Я запомню это. – keparo 2008-10-09 17:29:30

4

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

45

Язык, основанный на прототипе, не делает различия между классами и объектами: он просто имеет объекты. Язык, основанный на прототипе, имеет понятие прототипического объекта, объект, используемый в качестве шаблона, из которого можно получить начальные свойства для нового объекта. Любой объект может определять свои собственные свойства либо при его создании, либо во время выполнения. Кроме того, любой объект может быть связан как прототип для другого объекта, что позволяет второму объекту совместно использовать свойства первого объекта.

+5

Очень хорошее объяснение, но немного вводящее в заблуждение комментарий о «шаблоне для начальных свойств», ,Если вы измените прототип ПОСЛЕ создания объекта, этот объект все равно получит эти функции. – nickf 2008-10-09 07:46:44

27

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

+0

Вы все еще чувствуете себя так? Потому что если так, тогда это первое объяснение, когда-либо действительно просто прочно «щелкнув» со мной. – Chazt3n 2016-05-18 03:10:20

9

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

Выше возможно, потому что объекты по существу функционируют в скрипте java (закрытие тоже).

3

Если вы просто используете объекты во время выполнения вместо класса при компиляции для создания новых объектов, это открывает возможность расширения объекта, не зная никаких подробностей об этом. Конечно, это может стать недостатком довольно быстро в зависимости от использования. Я не делаю никаких предположений о языке здесь, поэтому он применим к языкам, отличным от javascript, которые не так динамичны.

myobject.prototype=unkownobject; 
myobject.newproperty=1; 

Вы можете получить объект из любого места; ваш собственный код, из сети, из базы данных, из внешних связей и так далее.

Обратите внимание, что язык не должен реализовывать наследование прототипа, например, javascript. В javascript объект-прототип просто разделяется, как и его свойства, среди наследников. Альтернативой является копирование всех свойств прототипа в новый объект. Каждый подход имеет свои сильные стороны в разных ситуациях. Мне нравится второй, но это не то, что делает javascript.

3

После прочтения всех ответов таков вывод

1) Наследование, в которых объекты наследуется непосредственно от других объектов

2), который не использует классы

3) Также называется экземпляр на основе программирование или бесклассовое прототипное программирование

4) Повторное использование поведения выполняется путем клонирования существующих объектов, которые служат прототипами

5) Объект, используемый в качестве шаблона из нового объекта, получает начальные свойства

0

JavaScript is a prototype-based programming language (вероятно, язык сценариев на основе прототипов является более правильным определением). Он использует клонирование, а не наследование. Язык программирования на основе прототипа - это стиль объектно-ориентированного программирования, который использует функции как конструкторы для классов. Хотя Javascript имеет класс ключевых слов, он не имеет инструкции класса. Это различие важно при сравнении JavaScript с другими языками ООП.