Что означает то, что JavaScript является основанным на прототипе языком?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

247
задан Tom van der Woerdt 28 December 2011 в 04:28
поделиться

6 ответов

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

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

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

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

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

не могут быть жестким правилом относительно того, почему prototypal наследование является выгодной формой повторного использования кода. Само повторное использование кода выгодно, и prototypal наследование является разумным способом идти об этом. Вы могли бы утверждать, что prototypal наследование справедливо простая модель повторного использования кода, и что код может быть в большой степени снова использован в [1 116] прямые пути . Но классические языки, конечно, в состоянии выполнить это также.

Заметка на полях: Преграды @Andrew делают правильное замечание, что существует на самом деле многие prototypal языки. Стоит отметить, что эти другие существуют, но также и стоящий замечания, что ни один из них не ничто похожее к господствующей тенденции. NewtonScript, казалось, имел некоторую тягу некоторое время, но умер с ее платформой. Также возможно расширить некоторые современные языки способами, которые добавляют prototypal возможности.

282
ответ дан 13 revs, 6 users 78% 23 November 2019 в 03:02
поделиться

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

52
ответ дан Guido 23 November 2019 в 03:02
поделиться

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

31
ответ дан CMS 23 November 2019 в 03:02
поделиться

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

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

10
ответ дан questzen 23 November 2019 в 03:02
поделиться

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

6
ответ дан Greg 23 November 2019 в 03:02
поделиться

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

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

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

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

5
ответ дан artificialidiot 23 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: