Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Наследование в Javascript / 12 сообщений из 12, страница 1 из 1
02.04.2015, 09:38
    #38924509
rpe4a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в Javascript
Всем доброе утро, не давно начал изучать 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
02.04.2015, 11:03
    #38924650
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в Javascript
rpe4a, в большинстве случаев можно без наследования обойтись.
...
Рейтинг: 0 / 0
02.04.2015, 11:11
    #38924671
rpe4a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в Javascript
skyANA, то есть по большому счету, для рядовых знаний это может и не пригодиться?
...
Рейтинг: 0 / 0
02.04.2015, 11:58
    #38924793
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в Javascript
rpe4askyANA, то есть по большому счету, для рядовых знаний это может и не пригодиться?это может не пригодиться даже для не рядовых знаний. мне, например, не пригодилось.
...
Рейтинг: 0 / 0
02.04.2015, 12:17
    #38924830
rpe4a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в Javascript
Antonariy, кто ж тогда этим пользуется? =) Видимо для написание всяких библиотек?
...
Рейтинг: 0 / 0
02.04.2015, 13:09
    #38924923
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в Javascript
rpe4aAntonariy, кто ж тогда этим пользуется? =)
Всякий, кто захочет...

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

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

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

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


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