Javascript prototype

Всем доброго времени суток. На связи Алексей Гулынин. В одной из прошлых статей я говорил, что все классы-конструкторы наследуют свойства и методы от Object, а экземпляры этих классов наследуют свойства и методы от своих классов-конструкторов. Как же происходит наследование в Javascript? Прямого понятия "наследование" в этом языке нет. Здесь есть понятие "прототипирования"
В каждом классе-конструкторе есть свои методы и свойства. С помощью свойства 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.
На связи был Алексей Гулынин. Увидимся в следующих статьях.