Во -первых, поделитесь примерами наследования прототипа JS для вашей ссылки. Конкретный контент заключается в следующем
1. Прототип JS прототип наследования
<! Doctype html> <html> <head> <meta charset = "UTF-8"> <Title> Prototype Prototype Prototype Prototype </teal> </head> <body> <!-Прототип наследия-> <) <function vare-varce = arfone = obf warf warf warf warf abfone = abf abfone = obf abfone = abf abfone = abf abfone abfone = abf abfone = // clone (). {}; // Это предложение является ядром прототипа наследования. Прототипом объектом функции является объект Literal_f.prototype = obj; вернуть новый _f; } // объявить объект буквального первого var Animal = {something: 'Apple', eat: function () {console.log ("eat" + this.somthing); }} // Нет необходимости определять подклассы человека, просто выполните клонирование var cat = clone (животное); // Вы можете напрямую получить значение по умолчанию, предоставленное лицом, или вы можете добавить или изменить атрибуты и методы console.log (cat.eat ()); Cat.somthing = 'Orange'; console.log (cat.eat ()); // объявить подкласс и выполнить клонирование var comeomen = clone (cat); </script> </body> </html>2. Принцип работы прототипа JavaScript Prototype Prototype
Хорошо известно, что JavaScript принимает прототип наследование, но, поскольку он предоставляет только один экземпляр реализации, новый оператор, по умолчанию, объяснение его всегда сбивает с толку. Давайте объясним, что такое прототип наследование и как использовать прототип наследования в JavaScript.
Определение прототипа наследования
Когда вы читаете объяснение о прототипе JS -прототипе, вы часто видите следующий текст:
При поиске свойств объекта JavaScript пройдет цепочку прототипа вверх до тех пор, пока не найден атрибут данного имени. - Из секретного сада JavaScript
Большинство реализаций JavaScript используют атрибут __proto__ для представления цепочки прототипа объекта. В этой статье мы увидим разницу между __proto__ и прототипом.
Примечание: __proto__ - это неформальное использование, которое не должно появляться в вашем коде. Здесь мы просто используем его, чтобы объяснить, как работает прототип JavaScript.
Следующий код показывает, как двигатель JS ищет свойства:
Функция getProperty (obj, prop) {if (obj.hashownproperty (prop)) return obj [prop] else if (obhДавайте приведем общий пример: двумерная точка имеет двумерную координату XY, которая аналогична использованию метода печати.
Используя определение прототипа наследования, которое мы упоминали ранее, мы создаем объектную точку с тремя свойствами: x, y и print. Чтобы создать новую двумерную точку, нам нужно создать новый объект, чтобы его __proto__ атрибут точки в пункте:
var point = {x: 0, y: 0, print: function () {console.log (this.x, this.y); }}; var p = {x: 10, y: 20, __proto__: point}; p.print (); // 10 20JavaScript странный прототип наследование
Что сбивает с толку, так это то, что никто, кто преподает прототип наследование, не даст такой кусок кода, но даст следующий код:
Функциональная точка (x, y) {this.x = x; this.y = y; } Point.prototype = {print: function () {console.log (this.x, this.y); }}; var p = новая точка (10, 20); p.print (); // 10 20Это отличается от того, что я сказал. Здесь становится функция, и есть также атрибут прототипа, и есть новый оператор. Что с этим происходит?
Как работает новый оператор
Создатель Брендан Эйх хотел сделать JS не сильно отличаться от традиционных объектно-ориентированных языков программирования, таких как Java и C ++. На этих языках мы используем новый оператор для создания нового объекта для класса. Поэтому он написал нового оператора в JS.
В C ++ есть концепция конструктора для инициализации свойств экземпляра, поэтому новый оператор должен быть нацелен на функции.
Нам нужно поместить метод объекта в одном месте. Поскольку мы используем язык прототипа, мы поместим его в свойства прототипа функции.
Новый оператор принимает функцию F и ее параметры: New F (аргументы ...). Этот процесс разделен на три шага:
Создайте экземпляр класса. Этот шаг состоит в том, чтобы установить свойство __proto__ пустого объекта на F.Prototype.
Инициализируйте экземпляр. Функция F передается в параметре и вызывается, и ключевое слово, которое установлено на этот экземпляр.
Возвращает экземпляр.
Теперь, когда мы знаем, как работает новый, мы можем реализовать его в коде JS:
функция новая (f) {var n = {'__proto__': f.prototype}; /*Step 1*/ return function () {f.apply (n, аргументы); /*Шаг 2*/ return n; /*Шаг 3*/}; }Небольшой пример его рабочей ситуации:
Функциональная точка (x, y) {this.x = x; this.y = y; } Point.prototype = {print: function () {console.log (this.x, this.y); }}; var p1 = новая точка (10, 20); p1.print (); // 10 20 console.log (P1 ExtanceOf Point); // true var p2 = new (point) (10, 20); p2.print (); // 10 20 console.log (p2 ancessionof point); // истинныйИстинное прототип наследование в JavaScript
Спецификация JS ECMA позволяет нам использовать нового оператора для прототипа наследования. Но великий мастер Дуглас Крокфорд обнаружил способ использовать новый для достижения истинного прототипа наследования! Он записал объект. Функция Create следующим образом:
Object.create = function (parent) {function f () {} f.prototype = parent; вернуть новый f (); };Это выглядит странно, но это довольно кратко: он создает новый объект и прототирует его до любого значения, которое вы хотите установить. Если мы допустим __proto__, мы также можем написать это:
Object.create = function (parent) {return {'__proto__': parent}; };Следующий код позволяет нашей точке зрения принять реальное прототип наследование:
var point = {x: 0, y: 0, print: function () {console.log (this.x, this.y); }}; var p = object.create (point); px = 10; py = 20; p.print (); // 10 20в заключение
Мы узнали, что такое прототип JS и как JS может реализовать его определенным образом. Однако использование реального прототипа наследования (например, Object.Create и __proto__) по -прежнему имеет следующие недостатки:
Стандартный дефицит: __ Proto__ не является стандартным использованием или даже неодобрением. В то же время, оригинальный Object.Create и оригинальная версия, написанная Daoye, также разные.
Плохая оптимизация: будь то нативный или индивидуальный объект. Создайте, его производительность гораздо меньше, чем у нового, а первое - в 10 раз медленнее, чем последняя.
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.