JavaScript не является объектно-ориентированным языком и не предоставляет традиционные методы наследования, но он обеспечивает способ наследования прототипа, используя свойства прототипа, которые он обеспечивает для достижения наследования.
Цепочка прототипа является основным методом наследования в JavaScript.
Основная идея прототипа цепочки: Используйте прототипы, чтобы один тип ссылки наследовал свойства и методы другого эталонного типа.
Связь между конструкторами, прототипами и экземплярами: каждый конструктор имеет объект прототипа, объект прототипа содержит указатель на конструктор, а экземпляр содержит внутренний указатель на объект прототипа.
Если объект прототипа равен экземпляру другого объекта, объект прототипа будет содержать указатель на другой прототип, и, соответственно, другой прототип также содержит указатель на другой конструктор.
Основной режим реализации цепочки прототипа:
function supertype () {this.property = true;} supertype.prototype.getsupervalue = function () {return this.property;}; function subtype () {this.subproperty = false;} // inheritypeubtype.protoypale = new supertype (); () {return this.subproperty;}; var ancess = new subtype (); alert (encos.getsupervalue ()); // истинныйПодтип наследует супертип, который достигается путем создания экземпляра супертипа и назначения экземпляра подтипу. Прототип. Суть реализации состоит в том, чтобы переписать объект прототипа и заменить его экземпляром нового типа. Таким образом, свойства и методы, которые первоначально существовали в экземпляре Supertype, также существуют в подтипе. Прототип. Затем добавьте метод в подтип.
Отношение экземпляра в приведенном выше примере выражается следующим образом:
Выше приведено не использует прототип, предоставленный подтипом по умолчанию, а вместо этого замените его новым прототипом; Этот новый прототип является экземпляром супертипа. Существует также указатель на прототип, который выполняет супертип внутри нового прототипа. В результате экземпляр указывает на прототип подтипа, который указывает на прототип супертипа. Метод getValue () все еще находится в супертипе. Прототип, но прототип находится в подтипе. Прототип. Это связано с тем, что свойство является свойством экземпляра, а GetSuperValue () - это метод прототипа. Поскольку подтип
Примечание: exants.constructor теперь указывает на Supertype, потому что прототип подтипа указывает на другой объект - прототип Supertype, а атрибут конструктора этого объекта прототипа указывает на Supertype.
При доступе к атрибуту в режиме чтения экземпляр сначала выполняется для этого атрибута. Если собственность не найдена. Затем поиск прототипа экземпляра будет продолжаться. Когда наследование достигается через цепочку прототипа, процесс поиска может продолжать двигаться вверх по цепочке прототипа.
Прототип по умолчанию
Все эталонные типы наследуют объект по умолчанию, и это наследование также реализуется через цепочку прототипа. Прототип по умолчанию всех функций является экземпляром объекта. Следовательно, прототип по умолчанию будет содержать внутренний указатель на Object.prototype. Вот почему пользовательские типы будут наследовать методы, такие как ToString (), valueOf () и т. Д.
Полная цепочка прототипа:
В вышеуказанной системе наследования подтип наследует супертип, а супертип наследует объект. Когда вызывается exants.tostring (), метод, сохраняемый в объекте. Прототип фактически вызывается.
Определите взаимосвязь между экземпляром и прототипом
Есть два способа определить взаимосвязь между прототипом и экземпляром:
Используйте экземпляр оператора
Alert (экземпляр EncementOf объекта); Alert (экземпляр Encementof supertype); Alert (экземпляры экземпляра подтипа);
Из -за взаимосвязи между цепочкой прототипа все вышеперечисленное возвращает истинность.
Используйте метод isprototypeof ()
alert (object.prototype.isprototypeof (экземпляр)); Alert (supertype.prototype.isprototypeof (экземпляр)); alert (subtype.prototype.isprototypeof (exant)); alert (subtype.prototype.isprototypeof (exant));
Тщательно определить метод
Код для добавления методов в прототип должен быть размещен после оператора, который заменяет прототип.
Function supertype () {this.property = true;} supertype.prototype.getsupervalue = function () {return this.property;}; function subtype () {this.subproperty = false;} supertype.prototype = new Supertype ();// Add Subtype.prototy.prototype = new Supertype ();// Add Subtype.prototy.Ley. this.subproperty;}; // перезаписывать метод subtype.prototype.getsupervalue = function () {return this.subproperty;}; // перезаписывать метод подтип.prototype.getsupervalue = function () {return false; vare -ancement; // ЛОЖЬВ приведенном выше примере следует отметить, что после замены прототипа экземпляром супертипа, затем определите эти два метода.
Кроме того, при наследстве через цепочку прототипа вы не можете использовать буквальный объект для создания прототипа метода. Потому что это переписать цепочку прототипа:
Function supertype () {this.property = true;} supertype.prototype.getsupervalue = function () {return this.property;}; function subtype () {this.subproperty = false;} // nehrit supertyptype.prototype = new supertype (); // addrit supertyptype.prototype = new supertype (); // addsepeubebe.prototype = new supertype (); // addshiT -stryLition. Код неверный subtype.prototype = {getsubvalue: function () {return this.subproperty;}, neeshethermethod: function () {return false;}}; var exance = new subtype (); alert (exaction.getsupervalue ()); // ошибкаПриведенный выше пример присваивает экземпляр супертипа прототипу, а затем заменяет прототип буквальным объектом. Текущий прототип содержит экземпляр объекта, а не экземпляр супертипа, и нет никакой связи между подтипом и супертипом.
Прототип проблемы цепи
Как упоминалось ранее, атрибуты прототипа, содержащие ссылочные типы, используются всеми экземплярами; Вот почему атрибуты должны быть определены в конструкторе, а не в объекте прототипа.
function supertype () {this.colors = ["red", "blue", "green"];} function subtype () {} subtype.prototype = new supertype (); var exaction1 = new subtype (); exancem.colors.push ("black"); alert (antain1.colors); // "красный", "синий", "зеленый", "черный" var ancome2 = new subtype (); alert (exants2.colors); // "красный", "синий", "зеленый", "черный"В приведенном выше примере свойство цвета определяется в конструкторе SuperType, который содержит массив, и каждый экземпляр SuperType будет иметь свойство цвета, которое содержит свой собственный массив. После того, как подтип наследует супертип через цепочку прототипа, подтип. Прототип становится экземпляром супертипа, поэтому он также имеет свой собственный атрибут цветов. Тем не менее, все экземпляры подтипа разделяют это свойство One Colors.
Другая проблема заключается в том, что нет способа передать параметры в суперклассский конструктор, не влияя на все экземпляры объекта.
Выше приведено соответствующее знание JavaScript на основе наследования цепочки прототипа, которое редактор представил вам. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!