Javascript prototype

Javascript prototype

Всем доброго времени суток. На связи Алексей Гулынин. В одной из прошлых статей я говорил, что все классы-конструкторы наследуют свойства и методы от Object, а экземпляры этих классов наследуют свойства и методы от своих классов-конструкторов. Как же происходит наследование в Javascript? Прямого понятия "наследование&quot в этом языке нет. Здесь есть понятие "прототипирования"

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

С помощью "prototype" можно создать любое свойство или метод, который будет наследоваться всеми экземплярами этого класса-конструктора. Если запрашивается какое-либо свойство или вызывается какой-либо метод у переменной, программа пытается найти их у самой переменной. Если поиск не дал результатов, программа ищет их в объекте-прототипе. Если и этот поиск не дал результатов, программа ищет их в объекте-прототипе Object (при условии, что сам экземпляр был создан не с помощью "Object"). На это цепочка поиска заканчивается.

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

Давайте на примерах попробуем более подробно разобраться с этим механизмом. Допустим, мы хотим добавить в класс "String" метод, который будет возвращать строку задом наперед:

String.prototype.reverseString = function() {
   var buf = ""; 
   for (var i = this.length - 1; i >= 0; i--) {
      buf = buf + this[i];   
   }
   return buf;
}
var str = "Hello";
alert(str.reverseString()); // выйдет "olleH"

Теперь у всех переменных типа данных "String" есть такой метод "reverseString()".

Давайте теперь попробуем изменить какой-либо метод, например метод "reverse()" у "Array". Сейчас данный метод разворачивает массив, тоже самое, что и метод, который мы только что создали "reverseString()". Сделаем, чтобы данный метод выводил квадраты чисел:

Array.prototype.reverse = function() {
   var a = [];
   for (i = 0; i < this.length; i++) {
      a[i] = this[i] * this[i];
   }
   return a;
}
var test = [1,5,7,2,5,-10];
var test2 = test.reverse();
alert(test2.join()); // чтобы не писать цикл

Вспомнить, что делает метод "join()" можно из этой статьи Array в javascript.

Также мы можем удалить встроенное свойство или метод из прототипа:

var a = [1,5,2];
a.sort(); // [1, 2, 5]
delete Array.prototype.sort;
a.sort();// ошибка, такого метода нет

В данной статье вы узнали про свойство prototype в Javascript. Надеюсь на данных примерах стало понятно, как работать с прототипом, и как работает механизм наследования в Javascript.

На связи был Алексей Гулынин. Увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *