Наследование в JavaScript довольно странно. Он не может реализовать наследование интерфейса и может полагаться только на прототип наследования.
Прототип цепочка
Прототип является объектом. Экземпляр, созданный через конструктор, будет иметь указатель на прототип для получения свойств и методов прототипа. Таким образом, объект экземпляра имеет метод атрибута конструктора и метод атрибутов прототипа, а затем указывает прототип конструктора, который необходимо унаследовать в этом экземпляре, так что все методы атрибута экземпляра могут быть унаследованы.
Смотрите следующий демонстрационный код:
// Объявит суперкласс, добавляйте соответствующие свойства и методы через конструкторы и прототипы Function Super () {this.property = true;} super.prototype.getSuperValue = function () {return this.propert SuperClass и получите все в SuperClass subtype.prototype = new Super (); subtype.prototype.constructor = subtype; subtype.prototype.getSubvalue = function () {return this.subproperty;}; // Создать объект из подкласса, чтобы проверить, чтобы neherit superclass methods и attibute; // var ar; console.log (exante.getSuperValue ());Прототип по умолчанию всех функций является экземпляром объекта, поэтому прототип по умолчанию будет содержать внутренний указатель на объект. Прототип.
Используйте экземпляр и iSprototypeof для определения взаимосвязи между прототипами и экземплярами:
экземпляр Encement of object; object.prototype.isprototypeof (exant);
При использовании прототиповых цепей вам необходимо тщательно определить метод. Подклассы должны переписать метод или расширение супертипа и должны быть размещены после операции, который заменяет прототип, чтобы он мог вступить в силу. Кроме того, при наследстве через цепочку прототипа вы не можете использовать объектные литералы для создания прототипа, который будет переопределять цепочку прототипа:
...... subtype.prototype = new super (); subtype.prototype = {....};Это заменяет указатель, чтобы указывать на новый объект, переписывая цепочку прототипа.
Метод наследования цепочек прототипа недостат, и есть две основные проблемы:
1. Из прототипа, содержащего значение типа эталонного типа, он будет передаваться всеми экземплярами.
Как упоминалось в предыдущей статье, атрибуты прототипа, содержащие значения типа ссылки, будут переданы всеми экземплярами. Один экземпляр будет изменен, а другие экземпляры будут меняться соответствующим образом. Следовательно, атрибуты должны быть определены в конструкторе. Когда цепочка прототипа наследует, независимо от того, определяются ли атрибуты в суперклассе в конструкторе или прототипе, все они становятся объектами экземпляров и унаследованы подклассами, что оказывает влияние на экземпляры подкласса.
2. При создании экземпляра подтипа параметры не могут быть переданы в конструктор SuperType.
Наследование цепочки прототипа непосредственно указывает на подкласс прототип на экземпляр суперкласса, и в настоящее время параметры могут быть переданы в Superclass. Однако, когда подкласс создает экземпляр, он может передавать только параметры только конструктору подкласса, но не конструктору суперкласса.
Следовательно, в практических приложениях прототипные цепи редко используются отдельно.
Некоторые связанные с ними практики кода
Определите атрибут прототипа
Функция hasprototyproperty (object, name) {return name in object &&! object.hasownproperty (name);}Использование объектов прототипа в конструкторах
Функция Person (name) {this.name = name;} person.prototype = {constructor: person, sayname: function () {console.log (this.name); }, toString: function () {}}; var person1 = new Person ('nicholas'); var person2 = new Person ('greg); console.log (человек 1 экземпляр человека); // trueconsole.log (person1.constructor === Person); // trueconsole.log (person1.constructor === Person); // trueconsole.log (person1.constructor === Object); // falseconsole.log (экземпляр человека 2); // trueconsole.log (person2.constructor === Person); // trueconsole.log (person2.constructor === Object); // ЛОЖЬОбъект наследование
var person1 = {name: 'nicholas', sayname: function () {console.log (this.name); }}; var person2 = object.create (person1, {name: {настраивается: true, umerable: true, value: 'greg', writeable: true}}); person1.sayname (); // nicholasperson2.sayname (); // gregconsole.log (person1.hasownproperty ('sayname')); // trueconsole.log (person1.ispropertyof (person2)); // trueconsole.log (person2.hasownproperty ('sayname')); // ЛОЖЬМодульный режим
var person = (function () {var age = 25; function getAge () {return Age;} function Growelder () {age ++;} return {name: 'nicholas', getage: getage, rowelder: growelder};} ());Синтрав с областью
Функция Person (name) {this.name = name;} person.prototype.sayname = function () {console.log (this.name);}; var person1 = person ('nicholas'); console.log (person1 instranceOf person); // falseconsole.log (typeof person1); // undefinedConsole.log (имя); // Николас