Чтение онлайн

на главную - закладки

Жанры

Основы программирования на JavaScript

Кан Марк

Шрифт:

var myArray = [1, 2, 3];

for(n in myArray) alert(n); // выводит 0, 1 и 2 - индексы массива.

Array.prototype.something = function{ };

for(n in myArray) alert(n); // выводит 'something', 0, 1 и 2.

Как можно видеть, здесь выполнено прототипирование Array и добавлена функция something. Однако теперь эта функция something видна как элемент массива, результат, который определенно не ожидался и не требовался. То же самое происходит с объектами и объектными литералами,

если выполнить прототипирование Object. Если можно быть абсолютно уверенным, что цикл for-in никогда не будет использоваться и никакой другой разработчик не будет использовать этот код JavaScript, то можно применять прототипирование для Array или Object, но надо помнить о связанных с этим проблемах. Однако существуют другие методы для достижения тех же результатов. Например, для расширения Array можно задействовать следующий метод без прототипирования:

Array.find = function(ary, element){

for(var i=0; i<ary.length; i++){

if(ary[i] == element){

return i;

}

}

return -1;

}

alert(Array.find(['a', 'b', 'c', 'd', 'e'], 'b')); // выводит 1

Как можно видеть, теперь необходимо печатать Array.find(ary, e) вместо ary.find(e), что пришлось бы делать, если прототипировать объект Array, но стоит напечатать эти несколько дополнительных символов, чтобы избежать потери существующей функциональности JavaScript.

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

1 Скрытая (Private) - объявляется с помощью var variableName или function functionName внутри объекта. Могут быть доступны только другим скрытым или привилегированным функциям.

2 Открытая (Public) - объявляется с помощью this.variableName внутри объекта. Может изменяться любой функцией или методом.

3 Привилегированная (Privileged) - объявляется с помощью this.functionName = function{ ... } внутри объекта. Доступна для любой функции или метода и может обращаться или изменять любую скрытую переменную.

4 Прототипированная (Prototype) - объявляется с помощью Class.prototype.variableName или Class.prototype.functionName. Объявленные таким образом функции будут иметь доступ к любой открытой или прототипированной функции. Попытки изменить созданную таким образом переменную будут вместо этого создавать новую открытую переменную на объекте, а прототипированная переменная будет недоступна.

5 Статическая (Static) - объявляется с помощью Class.variableName или Class.functionName. Может изменяться

любой функцией или методом. Такой метод используется редко.

Чтобы понять различия между уровнями, давайте рассмотрим пример:

function Cat(name, color){

/*

Конструктор: при создании объекта выполняется любой находящийся здесь код

*/

Cat.cats++;

/* Скрытые переменные и функции доступны только скрытым или привилегированным

функциям. Отметим, что 'name' и 'color', переданные в Class, уже являются

скрытыми переменными.

*/

var age = 0;

var legs = 4;

function growOlder{

age++;

}

/*

Открытые переменные доступны открыто или скрыто

*/

this.weight = 1;

this.length = 5;

/*

Привилегированные функции доступны открыто или скрыто.

Могут обращаться к скрытым переменным.

Невозможно изменить, можно только заменить открытой версией

*/

this.age = function{

if(age==0) this.length+=20;

growOlder;

this.weight++;

}

}

/*

Прототипированные функции доступны открыто

*/

Cat.prototype = {

talk: function{ alert('Meow!'); },

callOver: function{ alert(this.name+' ignores you'); },

pet: function{ alert('Pet!'); }

}

/*

Прототипированные переменные доступны открыто.

Нельзя перезаписать, только заменить открытой версией

*/

Cat.prototype.species = 'Cat';

/*

Статические переменные и функции доступны открыто

*/

Cat.cats = 0;

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

Лекция 9. Наследование и замыкание

Метод наследования. Полезные (и опасные) свойства замыкания.

В восьмой лекции были рассмотрены основы объектно-ориентированного программирования в JavaScript. В данной лекции эта тема будет продолжена рассмотрением методов наследования, а также полезных (и опасных) свойств замыкания.

В предыдущей лекции была создана функция 'Cat' :

function Cat(name){

this.name = name;

}

Cat.prototype = {

species: 'Cat',

talk: function{ alert('Meow!'); },

callOver: function{ alert(this.name+' ignores you'); },

pet: function{ alert('Pet!'); }

}

Теперь можно создать любое количество котов, но как быть, если мы захотим создать объект другого типа, например, собаку? В этом случае понадобится создать совершенно новую функцию, со своими собственными прототипами. Если два объекта используют одни и те же функции (например, можно было бы добавить функции sleep (спать), eat (есть), и play (играть)), то в результате мы бы имели чрезмерное дублирование кода. Решением является концепция наследования.

Поделиться:
Популярные книги

Бригадир

Вязовский Алексей
1. Бригадир
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Бригадир

Неудержимый. Книга XXV

Боярский Андрей
25. Неудержимый
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXV

Как я строил магическую империю 7

Зубов Константин
7. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фантастика: прочее
5.00
рейтинг книги
Как я строил магическую империю 7

Вечный. Книга III

Рокотов Алексей
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга III

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
Дважды одаренный. Том VI

Кодекс Охотника

Винокуров Юрий
1. Кодекс Охотника
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника

Тринадцатый XI

NikL
11. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Тринадцатый XI

Егерь

Поселягин Владимир Геннадьевич
3. Маньяк в Союзе
Фантастика:
боевая фантастика
альтернативная история
6.31
рейтинг книги
Егерь

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Газлайтер. Том 25

Володин Григорий Григорьевич
25. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 25

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

Император Пограничья 3

Астахов Евгений Евгеньевич
3. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 3