Как реализовать наследование на javascript?
Ответ
Есть несколько способов реализовать наследование в javascript.
Один из них называется наследование через прототипы (Prototypal Inheritance). Пример кода, в котором объект Cat наследуется от объекта Pet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// Определяем объект Pet. Сообщаем ему имя и количество лап. var Pet = function (name, legs) { this.name = name; // Сохраняем значения имени и количества лап. this.legs = legs; }; // Создаем метод, отображающий имя Pet и количество лап. Pet.prototype.getDetails = function () { return this.name + ' has ' + this.legs + ' legs'; }; // Определяем объект Cat, наследующий от Pet. var Cat = function (name) { Pet.call(this, name, 4); // Вызываем конструктор родительского объекта. }; // В этой строке осуществляется наследование от Pet. Cat.prototype = new Pet(); // Дописываем в Cat метод действия. Cat.prototype.action = function () { return 'Catch a bird'; }; // Создаем экземпляр Cat в petCat. var petCat = new Cat('Felix'); var details = petCat.getDetails(); // 'У Феликса 4 лапы'. var action = petCat.action(); // 'Поймал птичку'. petCat.name = 'Sylvester'; // Изменяем имя petCat. petCat.legs = 7; // Изменяем количество лап petCat!!! details = petCat.getDetails(); // 'У Сильвестра 7 лап'. |
Второй способ назовем функциональным наследованием (Functional Inheritance):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// Определяем объект pet. Сообщаем ему имя и количество лап. var pet = function (name, legs) { // Создаем объектный литерал (that). Включаем свойство name // для общедоступного использования и функцию getDetails(). // Лапы остаются приватными. Любые локальные переменные, // определенные здесь или переданные pet в качестве аргументов, // остаются приватными, но тем не менее будут доступны из функций, // которые определяются ниже. var that = { name: name, getDetails: function () { // По правилам видимости, действующим в JavaScript, // переменная legs будет доступна здесь (замыкание), // несмотря на то что она недоступна извне объекта pet. return that.name + ' has ' + legs + ' legs'; } }; return that; }; // Определяем объект cat, наследующий от pet. var cat = function (name) { var that = pet(name, 4); // Наследуем от pet. // Дописываем в cat метод действия. that.action = function () { return 'Catch a bird'; }; return that; }; // Создаем экземпляр cat в petCat2. var petCat2 = cat('Felix'); details = petCat2.getDetails(); // 'У Феликса 4 лапы'. action = petCat2.action(); // 'Поймал птичку'. petCat2.name = 'Sylvester'; // Мы можем изменить имя. petCat2.legs = 7; // Но не количество лап! details = petCat2.getDetails(); // 'У Сильвестра 4 лапы'. |