ТОП 10:

Наследование в языке программирования Javascript, используя прототипирование (prototype).



Прототипирование добавляет свойства и методы для вызывающих объектов. По способу получения объектом свойств чем то похоже на this. Но есть одно важнейшее отличие. This будет ссылаться на вызывающий объект, то есть свойство будет СКОПИРОВАНО в объект. Прототип это промежуточный объект, который является свойством любой функции и содержит по умолчанию только одно свойство - "constructor"- оно ссылается на нашу функцию, но если определить в функции ряд свойств и методов, то они будут содержаться в прототипе, то есть прототип НАСЛЕДУЕТ свойства.

This определяет свойства и методы конкретного вызывающего объекта, а prototype определяет свойства и методы всех вызывающих объектов, имеющих одинаковые свойства и методы, заданные нашей текущей ФУНКЦИЕЙ-конструктором и сохраненные в объекте - прототипе.

Итак прототипирование позволяет задавать свойства и методы для классов объектов, а не для объектов! А если быть более точным, то поскольку javascript не знает что такое классы, то при помощи прототипирования можно имитировать классы.

//свойство будет СКОПИРОВАНО в экземпляр класса

var myFun=function(){this.name="моя функция";}

//свойство будет УНАСЛЕДОВАНО экземпляром класса

myFun.prototype.property1="property1_value";

//создаем экземпляр класса

varmyFun1=newmyFun();

//Выведет "моя функция"

alert(myFun1.name);

//Выведет "property1_value"

alert(myFun1.property1);

Пока все одинаково. Результат не позволяет понять разницу между копированием и наследованием свойств. Попробуем присвоить объекту window свойство через this.

//Выведет "Имя окна"

window.name = '';

function myFun(){this.name="Имя окна";}

window.myFun();

alert(window.name);

Объект window получает свойство. Оно СКОПИРОВАНО в вызывающий объект. Теперь пробуем присвоить объекту window свойство через prototype, то есть наследование.

//Выведет пустое сообщение

window.name = '';

function myFun(){myFun.prototype.name="Имя окна_1";}

window.myFun();

alert(window.name);

Объект window не получает свойство. Глобальный объект window (то есть находящийся на самой верхней ступени иерархии объектов документа) не является экземпляром класса myFun и не может УНАСЛЕДОВАТЬ свойство. Причина в том, что в случае прототипирования нужно создать экземплер класса, который унаследует свойства. Создадим экземплер с именем test.

//Выведет "Имя 1"

Function myFun(){myFun.prototype.name="Имя 1";}

Var test = new myFun();

alert(test.name);

Test как экземпляр класса myFun УНАСЛЕДОВАЛ свойство name. Оператор new автоматически создает ссылку на промежуточный объект - прототип. Подведем некоторые итоги:

Прототип представляет собой промежуточный объект, который является свойством любой функции.

Если это будет функция - конструктор, то в прототипе содержатся все определенные в функции свойства и методы класса объектов.

С помощью прототипирования можно наследовать свойства конструктора через этот объект.

Наследуемые от прототипа свойства не копируются в объект, а как бы работают как неотъемлемое свойство, в этом отличие от поведения ключевого слова this

this - свойства копируются и по правилам копирования объектов, в случае копирования методов, копируются ссылки на методы. То есть при одновременном использовании метода класса несколькими экземплярами класса могут возникнуть ошибки! Все экземпляры класса будут использовать одну функцию.

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

В теле функции-конструктора целесообразно при помощи ключевого слова this задавать изменяемые свойства класса, передаваемые при создании объекта в качестве аргументов

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

Прототипирование позволяет реализовать наследование свойств классов. То есть создаем первый класс, потом создаем второй класс и ему наследуем свойства и методы первого класса. Потом создаем экземпляр класса = объект и распечатываем его свойства командой alert.

function one(){one.prototype.name = "имя";}

function two(){two.prototype.surname = "фамилия";}

two.prototype = new one();

three = new two();

alert(three.name+" и "+three.surname);







Последнее изменение этой страницы: 2017-02-10; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.235.66.217 (0.003 с.)