Интерпретация слова прототип в статьях о js

Рейтинг: 0Ответов: 1Опубликовано: 03.11.2014

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

  1. Данной фразой сравнивают прототип с классом, говоря об его абстракции.
  2. Или понимать нужно так, как написано?

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

Обновление

Тогда у меня ещё один вопрос:

function Test( ){}

Test.prototype = {
    n: 10
};

var a = new Test( );
console.log( a.n ); // это я от куда читаю?

a.n = 15; // а здесь куда записываю?

Статью читал уже.

Ответы

▲ 4Принят

JavaScript, это язык, в котором используется ООП не на основе классов, а на основе прототипов. Так называемое прототипное программирование. Прототип - это объект, реально существующий, на основе которого создается новый объект и наследуются его свойства.

Как вы понимаете, он одновременно является как экземпляром (он в отличие от класса существует, а не просто описан), так и прототипом в зависимости от того, как вы его используете.

Давайте на примерах.

Здесь объект objA выступает в качестве экземпляра объекта Object, а Object в качестве прототипа:

var objA = new Object();
objA.sayHello = "Hello ;)";

Теперь сделаем одну хитрую вещь:

var objB = {}
objB.__proto__ = objA;
objB.sayHello //выведет Hello ;)

Здесь мы создали объект b, со свойствами объекта а, то есть в данном случае объект a выступил прототипом. Получается своеобразная иерархия:

a.__proto__ = Object
b.__proto__ = a

Хотя objA является существующими экземпляром Object, он также является прототипом для объекта objB, для которого он указан как прототип. Здесь я напрямую указал объект objA как прототип, и все изменения в нем будут отражены и на objB.

P.S. Да, что-то я немного подзабыл JavaScript. При использовании ключевого слова new с функциями происходит примерно то же самое, создается новый объект с прототипом функции. Можно еще вот эту статейку почитать для понимания.


UPD.

Область видимость переменных такая: если свойство не найдено в текущем объекте, оно ищется в прототипе. Если нет в прототипе, оно ищется в прототипе прототипа и так далее вверх по иерархии объектов, пока не упрется в потолок.

function Test( ){}

Test.prototype = {
    n: 10
};

var a = new Test( );

В данном случае у самого объекта "а" нет свойства n, поэтому оно его находит в прототипе:

a.__proto__.n //a.n на самом деле нет

Но если мы пишем a.n = 15, то пишем в текущий объект и прототип перекрывается.

a.n = 15
a.n //равно 15, Он находит свойство в самом "а" и не лезет в прототипы.  
a.__proto__.n //по прежнему 10