Наследование в JavaScript

20-06-2019

Рассмотрим как между собой связаны Object, Function, Array, String и их прототипы. А будет приведен наилучший способ создания и наследования пользовательских типов в JavaScript. Эта статья написана под влиянием двух других статей: статья на хабре, ECMA-262 (то же на русском)

На диаграмме ниже показано отношение объекта Object и его наследников: Function, Array, String. Эта диаграмма нужна нам как вспомогательная. Если понять наследование встроенных типов, то можно правильно организовать наследование пользовательских типов.

Вот, например, объект Array наследуется от объекта Object, поэтому на любом экземпляре массива можно вызывать методы Object'та: constructor, toString, valueOf, hasOwnProperty

Наследование пользовательских объектов

За три года программирования на JavaScript мне пришлось видеть кучу реализаций классов и наследования в JavaScript. Воистину, JavaScript уникальный язык: сложный в понимании, но при этом многие люди считают, что прекрасно его понимают и лепят всякую ерунду, например специальные библиотеки для реализации классов и наследования. Я уже давно понял, что никакие библиотеки не нужны для создания классов, но до сегодняшнего дня я неправильно реализовывал наследование. Делал я примерно так:

function inherit1(subClass, superClass) { var superPrototype = superClass.prototype; for (var key in superPrototype) {if (superPrototype.hasOwnProperty(key)) subClass.prototype = superPrototype; } } // define classes MyClass = function() {/*constructor body*/}; MyClass.prototype._myProperty = '_myProperty'; Subclass = function() {/*constructor body*/}; // inherit Subclass from MyClass inherit1(Subclass, MyClass); // create Subclass instance var instance = new Subclass();

То есть тут не используется никакой фреймворк для создания классов (это вообще бред). Просто все члены родительского прототипа копируются в дочерний. Таким образом, свойство _myProperty будет доступно на объекте instance. Но какой ценой? Каждый класс в цепи наследования будет добавлять в прототип новые методы, поэтому в каждом ребенке цикл for in будет все длиньше и длиньше. Но не это главное. Главное, что если после создания наследника, в прототип родителя внести изменения, то эти изменения не будут видны в потомке. Короче говоря, в этом примере instance instanceof MyClass === false.

12

Смотрите также:
 Новый CheatEngine
 ICQ Mobile для Symbian
 Оптимизация и раскрутка web сайтов
 Продвижение сайтов
 Artmoney

Добавить комментарий:
Введите ваше имя:

Комментарий:

Защита от спама - решите пример:


Онлайн-игры для социальных сетей:

Понравились обзоры? Читайте еще!

Новые обсуждения на форуме:

Парк аттракционов "Сегодня парки отдыха практически повсеместно вытесняются тематическими парками, хотя обычно эти два определения смешивают.."
Зачем надо учиться играть в шахматы? "Шахматы долгое время считались игрой королей и аристократов.."