Основы программирования на JavaScript | страница 43



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


Array.find = function(ary, element){

for(var i=0; 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(){