Legacy and Inheritance: немного оффтопа про .prototype, мысли неофита

от автора

Постараюсь быть неимоверно кратким.

Статей про наследование в JS не счесть:

Считаю важным добавить, что есть терминологическая разница на уровне языка носителей, т.е. — английского. И это принципиально важно, когда Вы работаете с прототипами в JS.

У меня в google по запросу "what is the difference between inheritance and legacy" первая ссылка ведёт сюда: ссылка.

Само собой, что статей там не одна.

Там есть такая строчка, дописка: 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.

Краткая суть, которая не отражает всей глубины, которую я себе уяснил, в том, что:

  • legacy — это взгляд со стороны родителя, широкий
  • inheritance — это взгляд со стороны потомка, узкий

Поэтому я считаю, что в обычных ООП языках программирования типа Java, C#, С++ и т.п. используется термин наследство.

А у нас в JavaScript используется почти то же самое, но немного шире: наследство.

А т.к. в Русском Языке разницы между этими понятиями нет, то отсюда и масса FuckUp’ов с пониманием зачем это нужно.

Мне интересно, что уважаемое сообщество думает по этому поводу, поэтому прошу под кат.

Вот код из Node.JS REPL> console.log(util.inherits.toString())

function (ctor, superCtor) { 	ctor.super_ = superCtor; 	ctor.prototype = Object.create(superCtor.prototype, { 		constructor: { 			value: ctor, 			enumerable: false, 			writable: true, 			configurable: true 		} 	}); } 

(если кому интересно, разглядывал через это средство, используйте осторожно, т.к. я — автор)

Вот обычный код, который обычно используют:

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/tutorial/object/inheritance,

function extend(Child, Parent) { 	var F = function() { }; 	F.prototype = Parent.prototype; 	Child.prototype = new F(); 	Child.prototype.constructor = Child; 	Child.superclass = Parent.prototype; }; 

Обратите внимание, используется термин Inheritance.

Что мы имеем в итоге, так это то, что мы, как правило, делаем так:

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.

Но как её использовать, и почему всё «так», может быть не совсем понятно даже не новичку.

Поэтому прошу, господа, пишите в своих топиках\статьях\обзорах, что между legacy и inheritance есть разница. И что для носителей языка она очевидна, а для не носителей — совсем нет, просто — синонимы.

ссылка на оригинал статьи http://habrahabr.ru/post/213441/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *