Хотя это работает, мы немного
sam.talk(); // Мяу! joe.talk(); // Гав!
Хотя это работает, мы немного ограничены в своих возможностях. Например, прототипирование не действует при использовании этого метода: все прототипы, заданные на Animal, не будут переноситься в функции Cat или Dog. Как мы знаем из предыдущей лекции, определенные внутренне с помощью "this." функции создают новый экземпляр всякий раз при создании новой копии предка. В этом случае всякий раз при создании функции Animal, Cat или Dog появляется новая копия функций species и sleep. Как можно догадаться, это не самый эффективный способ.
Лучшим подходом является прототипирование всего родительского класса на классе-потомке. Это предоставляет доступ ко всем свойствам и методам класса предка:
function Animal(name){ this.name = name; } Animal.prototype = { species: 'Animal', sleep : function(){ alert(this.name+' спит: Хрррр'); } }
function Cat(name){ Animal.apply(this, arguments); } Cat.prototype = new Animal; Cat.prototype.species = 'Cat'; Cat.prototype.talk = function(){ alert('Мяу!'); }
function Dog(name){ Animal.apply(this, arguments); } Dog.prototype = new Animal; Dog.prototype.talk = function(){ alert('Гав!'); }
var sam = new Cat('Sam'); var joe = new Dog('Joe');
sam.sleep(); // Sam спит : Хрррр joe.sleep(); // Joe спит: Хрррр
alert(sam.species); // Cat alert(joe.species); // Animal - для Dog функция species не определена
Можно продолжить это дальше и создать отдельные функции для различных пород собак или кошек и т.д.
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий