- PVSM.RU - https://www.pvsm.ru -
Постараюсь быть неимоверно кратким.
Написано для тех, кто только начинает!
Статей про наследование в JS не счесть:
Считаю важным добавить, что есть терминологическая разница на уровне языка носителей, т.е. — английского. И это принципиально важно, когда Вы работаете с прототипами в JS.
У меня в google по запросу "what is the difference between inheritance and legacy [4]" первая ссылка ведёт сюда: ссылка [5].
Само собой, что статей там не одна.
Там есть такая строчка, дописка: Also, as pointed out in some comments, «inheritance» is generally from the viewpoint of the receiver, while «legacy» is from the viewpoint of the giver: My inheritance was my father's legacy.
Краткая суть, которая не отражает всей глубины, которую я себе уяснил, в том, что:
Поэтому я считаю, что в обычных ООП языках программирования типа Java, C#, С++ и т.п. используется термин inheritance — наследование [6].
А у нас в JavaScript используется почти то же самое, но немного шире: legacy — наследство [7].
А т.к. в Русском Языке разницы между этими понятиями почти нет, то отсюда и масса FuckUp'ов с пониманием зачем это нужно.
И, в том числе потому, что от Legacy code [8] мы никуда не денемся.
UPD: В комментариях подсказывают, что речь идёт о Гипотезr Сепира-Уорфа [9], спасибо.
function (ctor, superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
}
(если кому интересно, разглядывал через это средство [10], используйте осторожно, т.к. я — автор)
Вот обычный код, который обычно используют:
function inherit(Child, Parent) {
var BlankClass = function () {};
BlankClass.prototype = Parent.prototype;
Child.prototype = new BlankClass();
Child.prototype.constructor = Child;
Child.prototype.superclass = Parent;
};
Тот же код, но с сайта javascript.ru,
function extend(Child, Parent) {
var F = function() { };
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.superclass = Parent.prototype;
};
javascript.ru/tutorial/object/inheritance [11]
Обратите внимание, используется термин Inheritance!
Да, и, тут, наверное важно прояснить позицию, т.к. я ЗА такой подход, за оба подхода. Но, как и все мы, я против legacy code в широком смысле. Но от этого никуда не деться.
В итоге, мы, как правило, делаем так:
var SomeChild = function () {};
var SomeParent = function () {};
inherit (SomeChild, SomeParent);
SomeChild.prototype.overload_something = 'something_we_need_to_FuckUp';
В результате чего, собственно, и реализуется «наследование с перегрузкой методов».
Проблем здесь, вроде бы, нет, потому, что все к этому привыкли. Это «стандартная» реализация, и от неё «никуда». Она базируется на Inheritance парадигме.
Но, при чём здесь legacy?
Я считаю, что при том, что, как ни крути, в этом случае взгляд всегда будет со стороны Родителя. Для того, чтобы разобраться в переопределённом коде, нужно посмотреть, какие методы были у родителя, и у его родителя, и если там ещё ветки были, и т.п, и т.д. Вроде бы так всегда было, и все предполагать должны, что так оно и есть. В этом и состоит архитектура и дизайн.
Это мантра.
И вроде бы про это про всё везде написано, и всем новичкам это объясняют.
Но этого мало, потому, что:
>> Legacy, as it relates to inheritance, will be of broader or deeper scope. When inheritance refers to one generation's gifts to another, a legacy would refer to three or four generations. >>
То есть, вот, ни для кого не новость, что есть prototype chain [12].
Но как её использовать, и почему всё «так», может быть не совсем понятно даже не новичку.
Поэтому прошу, учитывайте, что между legacy и inheritance есть разница. И что для носителей языка она ещё более очевидна, чем для нас, не носителей. Просто почему-то новичкам часто кажется, что её почти нет, так себе — синонимы.
Автор: wentout
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/55570
Ссылки в тексте:
[1] Здесь, на Хабре: http://habrahabr.ru/search/?q=prototype
[2] google: https://www.google.ru/search?newwindow=1&noj=1&site=webhp&q=jsvascript+prototype&oq=jsvascript+prototype
[3] yandex: http://yandex.ru/yandsearch?text=jsvascript+prototype&lr=39
[4] what is the difference between inheritance and legacy: https://www.google.ru/search?q=what+is+the+difference+between+inheritance+and+legacy
[5] ссылка: http://english.stackexchange.com/questions/17769/what-is-the-difference-between-legacy-and-inheritance
[6] inheritance — наследование: http://translate.google.com/#en/ru/inheritance
[7] legacy — наследство: http://translate.google.com/#en/ru/legacy
[8] Legacy code: http://en.wikipedia.org/wiki/Legacy_code
[9] Гипотезr Сепира-Уорфа: https://ru.wikipedia.org/wiki/Гипотеза_Сепира-Уорфа
[10] это средство: https://github.com/wentout/in_repl
[11] javascript.ru/tutorial/object/inheritance: http://javascript.ru/tutorial/object/inheritance#nasledovanie-na-klassah-funkciya-extend
[12] prototype chain: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain
[13] Источник: http://habrahabr.ru/post/213441/
Нажмите здесь для печати.