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



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 (играть)), то в результате мы бы имели чрезмерное дублирование кода. Решением является концепция наследования.

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