powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Наследование в Javascript
12 сообщений из 12, страница 1 из 1
Наследование в Javascript
    #38924509
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброе утро, не давно начал изучать javascript, хотя знаком с ООП на примере языка C#. Думал, что наследование в javascript'e простая штука, но читая книгу ДЕВИДА ФЛЕНАГАНА и пару статей на "javascript.ru", понял, что не до конца разобрался с этим моментом. Он заключается в следующем, допустим у нас есть некий родительский класс Pet и классы наследники Cat, Dog:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
//конструктор класса Pet
function Pet(name) {
    this.name = name;
    this.canWalk = true;
}
//несколько методов определенных в прототипе
Pet.prototype.getName = function () {
    return "|" +this.name.toUpperCase() + "|";
}
//....
//конструктор класса Cat
function Cat(name) {
    Pet.apply(this, arguments); //вызываем конструктор базового класса Pet, при инициализации Cat.
}
//конструктор класса Dog
function Dog(name) {
    Pet.apply(this, arguments); //вызываем конструктор базового класса Pet, при инициализации Dog.
}



Далее переходим собственно к наследованию, для начала приведу 2 самых простых и распространенных примера:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//1. через new, говорят, что так лучше никогда не делать, почему(потому что якобы создается фиктивный родитель)?
Cat.prototype = new Pet(); //тут происходит наследование, как я понимаю на основе прототипов, но в прототип записывается целый объект Pet, что и является дурным тоном.
Cat.prototype.constructor = Cat; //явно объявляем конструктор Cat

var c = new Cat("Thomas"); //создаем объект класса Cat
console.log(c.getName()); // -> |THOMAS|
console.log(c instanceof Cat); //-> true
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
//2. через Object.create(), тут уже наследование происходит от прототипа родителя
Dog.prototype = Object.create(Pet.prototype); //наследование через прототип родителя
Dog.prototype.constructor = Dog; //явно объявляем конструктор Dog

var d = new Dog("Guffy"); //создаем объект класса Dog
console.log(d.getName()); // -> |GUFFY|
console.log(d instanceof Dog); //-> true


Теперь перейдем к 2 примерам, которые мне показались странными, по сравнению с предыдущими 2умя(см. выше), потому что в итоге результат дают они почти все одинаковый, приступим:
Код: javascript
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
//3. пример с сайта "javascript.ru", через функцию extend()
//собственно определяем функцию
function extend(child, parent) {
    var f = function () { } //фиктивный конструктор
    f.prototype = parent.prototype; //наследуем прототип родительского класса
    child.prototype = new f(); //ребенок наследует объект f с прототипом родителя и пустым конструктором
    child.prototype.constructor = child; //явно объявляем конструктор ребенка
    child.superclass = parent.prototype; //ну тут определяем прототип родителя в свойстве ребенка
}

//определим класс Humster
function Humster(name) {
    Humster.superclass.constructor.apply(this, arguments); //теперь конструктор базового класса вызывается через переменную superclass
    //Pet.apply(this, arguments);
}
extend(Humster, Pet); //осуществляем наследование

var h = new Humster("Xoma"); //определяем объект класса Humster
console.log(h.getName()); // -> |XOMA|
console.log(h instanceof Humster); // -> true
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
//4. пример из книги Д. Фленагана, через функцию inherit()
//собственно определяем функцию
function inherit(p) {
    if (p == null) throw TypeError(); // p не может быть значением null
    if (Object.create) // Если Object.create() определена...
        return Object.create(p); // использовать ее.
    var t = typeof p; // Иначе выяснить тип и проверить его
    if (t !== "object" && t !== "function") throw TypeError();
    function f() { }; // Определить фиктивный конструктор.
    f.prototype = p; // Записать в его свойство prototype ссылку на объект p.
    return new f(); // Использовать f() для создания "наследника" объекта p.
};

//определим класс Fish
function Fish(name) {
    Pet.apply(this, arguments); //вызываем конструктор базового класса Pet, при инициализации Fish.
}
Fish.prototype = inherit(Pet.prototype); //производим наследование, через функцию inherit()
Fish.prototype.constructor = Fish; //явно объявляем конструктор Fish

//объявляем объект класса Fish
var fh = new Fish("Rodger");
console.log(fh.getName()); // -> |RODGER|
console.log(fh instanceof Pet); //-> true


В итоге мы имеем 4 примера, но последние 2 явно основаны на 2 первых, я никак не могу понять зачем так все усложнять и какие выгоды мы получаем пользуясь последними 2умя? Какой бы метод использовали вы и вообще в повседневной жизни часто ли вы встречаетесь в наследованием в javascript? Возможны ли какие то альтернативы или примеры с вашей повседневной практики наследования в javascript? Или есть какие то библиотеки, которые делают это прозрачней?
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38924650
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4a, в большинстве случаев можно без наследования обойтись.
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38924671
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA, то есть по большому счету, для рядовых знаний это может и не пригодиться?
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38924793
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4askyANA, то есть по большому счету, для рядовых знаний это может и не пригодиться?это может не пригодиться даже для не рядовых знаний. мне, например, не пригодилось.
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38924830
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, кто ж тогда этим пользуется? =) Видимо для написание всяких библиотек?
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38924923
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4aAntonariy, кто ж тогда этим пользуется? =)
Всякий, кто захочет...

rpe4aВидимо для написание всяких библиотек?
Причины могут быть и не важны...
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38925414
Фотография бухалтер фантоцци
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4aкто ж тогда этим пользуется? =) Видимо для написание всяких библиотек?ООП-задроты
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38925424
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4askyANA, то есть по большому счету, для рядовых знаний это может и не пригодиться?Разве что при устройстве на работу :)
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38925470
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4aAntonariy, кто ж тогда этим пользуется? =) Видимо для написание всяких библиотек?Пожалуй.

Я где-то слышал, что в случаях, когда одно и то же можно сделать с prototype и без prototype, вариант с prototype будет работать быстрее. Это важно в долгоиграющих алгоритмах, которые можно повстречать в основном в играх и графике.

Обработчики же событий типа нажатий на кнопки, которые по сути составляют чуть менее чем всё веб-программирование, выполняются эпизодически и не критичны к скорости исполнения js - большую часть времени работы обработчика браузер перерисовывает интерфейс или ждет ответа сервера (при ajax-запросах), а не исполняет код.

С точки зрения архитектуры приложения js-наследование не дает преимуществ в удобстве разработки перед подходом "высрать всё прямо в этом онклике", поскольку архитектуру все равно приходится держать в голове целиком. Из-за слабой типизации и динамической природы объектов js среда разработки редко когда может дать адекватную подсказку. Спасает TypeScript.
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38925824
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, спасибо за комментарий. Возьму все это на заметку.
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38925838
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, отдельное спасибо за TypeScript, глянул на сайте его, он хорошь. По крайне мере по примерам, что-то напоминающее С# классы интерфейсы и все в удобном прозрачном виде. Спасибо!
...
Рейтинг: 0 / 0
Наследование в Javascript
    #38926627
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Наследование в Javascript
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]