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



, чтобы добавить функцию sleep.

Существует более быстрый способ добавления прототипов. С помощью объектного литерала можно одновременно задать любое количество прототипов свойств или методов.


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!'); }

}


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


Object.prototype.method = function(){ ... }.


Если попробовать теперь добавить в cat метод sleep с помощью этого метода:


Cat.prototype = {

sleep: function(){ alert(this.name+' falls asleep'); }

}


то предыдущие прототипы, species, talk, callOver и pet, будут все удалены. Единственным имеющимся прототипом для cat будет sleep.

Прототипы можно также использовать для расширения встроенных объектов JavaScript. Можно реализовать, например, функцию String.prototype.reverse, которая будет возвращать любую созданную строку в обратном порядке:


String.prototype.reverse = function(){

var out = '';

for(var i=this.length-1; i>=0; i--){

out+=this.substr(i, 1);

}

return out;

}

alert('asdf'.reverse());


Это может быть очень полезным инструментом при правильном использовании. Можно реализовать String.prototype.trim() для удаления из строки всех пробелов, Date.prototype.dayName - для получения названия дня недели из объекта Date и т.д. Однако настоятельно рекомендуется воздержаться от добавления каких-либо прототипов в Array или Object, так как в этом случае циклы for-in для двух этих типов данных будут работать неправильно. Рассмотрим следующий пример:


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, то можно применять прототипирование для