При создании объектов с помощью конструкторов объектов или литералов объектов при создании многих объектов с одним и тем же интерфейсом будет сгенерировано большое количество дублированного кода. Для простоты была введена заводская модель.
Заводская модель
Функция CreatePerson (имя, возраст, задание) {var obj = new Object (); obj.name = name; obj.age = возраст; obj.job = job; obj.sayhello () {alert (this.name); }; return obj;} var p1 = createperson ("xxyh", 19, "Progrommer"); var p2 = createperson ("Zhangsan", 18, "студент");Этот способ создания объектов значительно упрощает код, но есть также недостаток, то есть тип объекта не может быть определен. Чтобы решить эту проблему, появляется следующий шаблон.
Режим конструктора
Создайте пользовательский конструктор для определения свойств и методов пользовательских типов объектов.
Функция человека (имя, возраст, задание) {this.name = name; this.age = возраст; this.job = job; this.sayname = function () {alert (this.name); };} var p1 = новый человек ("xxyh", 19, "программист"); var p2 = новый человек ("Джек", 18, "Студент");В приведенном выше примере Person () заменяет CreatePerson (). Кроме того, есть несколько различий:
• Создать объекты без отображения;
• непосредственно назначьте атрибуты и методы этому объекту
• Нет оператора возврата
Чтобы создать объект человека, вы должны использовать новый оператор. Он разделен на 4 шага:
• Создать новый объект
• Назначьте сферу конструктора новому объекту
• Выполните код в конструкторе
• вернуть новый объект
P1 и P2 соответственно сохраняют экземпляр человека.
оповещение (P1.Constructor == Person); // TrueAlert (p2.constructor == Person); // истинный
Лучше всего использовать экземпляр при обнаружении типов:
Alert (P1 EncementOf Object); // trueAlert (экземпляры P1); // TrueAlert (P2 ExtanceOf Object); // TrueAlert (P2 Exaction Of Person); // TrueAlert (P2 Exaction Of Person); // истинный
P1 и P2 являются экземплярами объекта, потому что все объекты наследуются от объекта.
2.1 рассматривать конструкторы как функции
// Использовать var person = new Person ("xxyh", 19, "Программист"); person.sayname (); // "xxyh" // Использование как нормальное функционирование человека ("Чжангсан", 18, "Студент"); // Добавить в windowswindow.sayname (); // "Zhangsan" // CALL VAR obj в области другого объекта obj = new Object (); Person.call (obj, «Джек», 29, «Менеджер»); obj.sayname (); // "Джек", OBJ обладает всеми свойствами и методами2.2 Проблема конструктора
Проблема с использованием конструкторов заключается в том, что каждый метод должен быть воссоздан в каждом экземпляре. У P1 и P2 есть метод SAYNAME (), но они не являются экземпляром функции. В JavaScript функция является объектом, поэтому каждый раз, когда определяется функция, объект создается.
Конструктор также можно определить так:
Функция человека (имя, возраст, задание) {this.name = name; this.age = возраст; this.job = job; this.sayname = new Function ("alert (this.name)");}Следовательно, функции одного имени в разных случаях не равны:
оповещение (p1.sayName == p2.sayname); // ЛОЖЬ
Однако создание двух функций с той же функцией является избыточным, и нет необходимости связывать функцию с конкретным объектом перед выполнением кода.
Функция человека (имя, возраст, задание) {this.name = name; this.age = возраст; this.job = job; this.sayname = sayname;} function showername () {alert (this.name);} var p1 = новый человек («xxyh», 19, «программист»); var p2 = новый человек («Джек», 18, «Студент»);Вышеуказанное перемещает определение sayname () вне конструктора, а затем устанавливает атрибут, который говорит, как глобальная функция SayName внутри конструктора. Таким образом, SayName содержит указатель на функцию, а P1 и P2 имеют одну и ту же функцию SayName (), определенную в глобальной области.
Тем не менее, есть новая проблема с этим: функции, определенные в глобальной области, могут быть вызваны только определенным объектом. И если объект определяет много методов, эталонный тип теряет свою инкапсуляцию.
Прототип цепочки режима
Каждая функция имеет свойство прототипа, которое является указателем, указывающим на объект. Цель этого объекта состоит в том, чтобы включить свойства и методы, которые могут быть переданы всеми экземплярами определенного типа . Прототип является объектом прототипа этого экземпляра объекта, созданного путем вызова конструктора. Преимущество использования объекта прототипа состоит в том, что все экземпляры объекта могут использовать свойства и методы, которые он содержит. Это означает, что вместо определения информации экземпляра объекта в конструкторе эта информация добавляется в объект прототипа.
function person () {} person.prototype.name = "xxyh"; person.prototype.age = 19; person.prototype.job = "Progrommer"; Person.prototype.sayname = function () {alert (this.name);}; var person1 = new Person (); Person1.sayname (); // "xxyh" var person2 = new Person (); Person2.sayname (); // «xxyh» оповещение (Person1.sayname == person2.sayname); // истинный3.1 Понимание объектов прототипа
Просто создайте новую функцию, будет создано свойство прототипа для функции, которая указывает на объект прототипа функции. По умолчанию все объекты прототипа автоматически получат свойство конструктора. Это свойство содержит указатель на функцию, в которой находится свойство прототипа. Person.prototype.constructor указывает на человека.
Когда конструктор вызван для создания экземпляра, внутренняя часть экземпляра будет содержать указатель (внутреннее свойство) на объект прототипа конструктора, называемый [[прототип]]. Доступ через _proto в Firefox, Safari и Chrome. Это соединение существует между экземпляром и объектом прототипа конструктора, а не между экземпляром и конструктором.
На следующем рисунке показано взаимосвязь между каждым объектом:
Person.prototype указывает на объект прототипа, а Person.prototype.constructor указывает на человека. В дополнение к атрибуту конструктора в прототипе есть и другие добавленные атрибуты. Все экземпляры содержат внутреннее свойство, которое указывает только на человека. Прототип, и у них нет прямой связи с конструктором.
Хотя [[прототип]] не может быть доступен, метод iSprototypeof () может использоваться для определения того, существует ли такая связь между объектами.
Alert (person.prototype.isprototypeof (person1)); // trueAlert (person.prototype.isprototypeof (person2)); // истинный
При чтении свойств объекта выполняется поиск с целью атрибута с данным именем. Поиск начинается с самого экземпляра объекта. Поиск начинается с самого экземпляра объекта. Если атрибут с данным именем находится в экземпляре, значение атрибута возвращается; Если это не найдено, продолжайте искать объект прототипа, указанный указателем и ищите атрибут с данным именем в объекте прототипа. Если это свойство найдено в объекте прототипа, значение свойства возвращается.
Значения, сохраненные в прототипе, можно получить через экземпляр объекта, но значения, хранящиеся в прототипе, не могут быть переписаны через экземпляр объекта . Если вы добавите атрибут в экземпляр с тем же именем, что и атрибут в прототипе экземпляра, атрибут заблокирует атрибут в прототипе.
function person () {} person.prototype.name = "xxyh"; person.prototype.age = "20"; person.prototype.job = "Программист"; Person.prototype.sayname = function () {alert (this.name);}; var person1 = new Person (); var person2 = new Person (); "ооооо"; оповещение (Person1.name); // «Ооооо» предупреждение (Person2.name); // "xxyh"В приведенном выше примере атрибут имени в Person1 блокирует атрибут имени в прототипе.
Когда атрибут добавляется в экземпляр объекта, этот атрибут будет блокировать атрибуты того же имени, сохраненные в объекте прототипа. Это означает, что существование этого свойства предотвратит доступ к этому свойству в прототипе. Используйте Delete для удаления свойств экземпляра.
function person () {} person.prototype.name = "xxyh"; person.prototype.age = "20"; person.prototype.job = "Программист"; Person.prototype.sayname = function () {alert (this.name);}; var person1 = new Person (); var person2 = new Person (); "ооооо"; оповещение (Person1.name); // «Ооооо» предупреждение (Person2.name); // "xxyh" Delete Person1.name; Alert (Person1.name); // "xxyh"HasownProperty () может обнаружить, существует ли свойство в экземпляре или в прототипе.
function person () {} person.prototype.name = "xxyh"; person.prototype.age = "20"; person.prototype.job = "Программист"; Person.prototype.sayname = function () {alert (this.name);}; var person1 = var person2 = new. Person (); alert (person1.hashownproperty ("имя")); // falsePerson1.name = "ooooo"; alert (person1.hasownproperty ("name")); // истинныйНа следующем рисунке показано взаимосвязь между реализацией и прототипом в разных ситуациях:
3.2 Прототип и в операторе
Как использовать оператор в операторе: используйте его в одиночку, в цикле For-In. При использовании отдельно оператор возвращает True при доступе к данному свойству через объект , независимо от того, существует ли он в экземпляре или в прототипе.
function person () {} person.prototype.name = "xxyh"; Person.prototype.age = "20"; Person.prototype.job = "Программист"; Person.prototype.sayname = function () {alert (this.name);}; var person1 = new Person (); alert ("name" in Person1); // trueperson1.name = "ooooo"; alert ("name" on person1); // истинныйВ сочетании с предыдущей функцией hasownproperty () можно определить, что свойство является свойством в прототипе или свойство в экземпляре. Если оператор возвращает True, а HasownProperty возвращает false, собственность является свойством в прототипе.
Функция hasprototyproperty (object, name) {return!Далее, давайте посмотрим на использование Hasprototyproperty ():
function person () {} person.prototype.name = "xxyh"; person.prototype.age = "20"; person.prototype.job = "Programmed"; Person.prototype.sayname = function () {alert (this.name);}; var person = new Person (); alert (hasprototyproproproproth // trueperson.name = "ooooo"; alert (hasprototyproperty (человек, "имя")); // ЛОЖЬПри использовании петли для внесения в инвентарь все перечисляемые свойства, которые можно получить через объект, включая свойства в экземпляре и свойства в прототипе. Атрибуты экземпляра, которые блокируют неиспользуемые данные в прототипе (то есть атрибуты, отмеченные как ложные по [[[перечисляют]]), также будут возвращены в форме, поскольку в соответствии с правилами, все атрибуты, определенные разработчиками.
Чтобы получить все перечисленные свойства экземпляра на объекте, вы можете использовать метод object.keys ().
function person () {} person.prototype.name = "xxyh"; person.prototype.age = "20"; person.prototype.job = "Программист"; person.prototype.sayname = function () {alert (this.name);}; vare keys = object.keys (person.prototype); // Имя, возраст, работа, SayNamevar P1 = New Person (); P1.name = "OOOO"; P1.age = 15; var p1_keys = object.keys (p1); alert (p1_keys); // имя, возрастЕсли вам нужно получить все свойства экземпляра, вы можете использовать метод object.getownPropertyNames ()
var keys = object.getOwnPropertyNames (person.prototype); Alert (Keys); // "Конструктор, имя, возраст, работа, sayname"
3.3 более простой синтаксис прототипа
Чтобы упростить вход, переопределите интегрированный объект прототипа с помощью буквального объекта, содержащего все свойства и методы.
function person () {} person.prototype = {name: "xxyh", возраст: 18, job: "programmer", sayname: function () {alert (this.name); }};Вышеупомянутые устанавливают Person.prototype, чтобы сравниться с новым объектом, созданным в буквальной форме объекта. Результат такой же, но атрибут конструктора больше не указывает на человека.
Правильный результат может быть возвращен через экземпляр, но конструктор не может определить тип объекта:
var Boy = new Person (); Alert (экземпляр мальчика объекта); // TrueAlert (мальчик -экземпляр человека); // trueAlert (boy.constructor == человек); // falseAlert (boy.constructor == Object); // истинный
Значение конструктора может быть установлено следующими способами:
function person () {} person.prototype = {Constructor: Person, имя: "xxyh", возраст: 18, job: "programmer", sayname: function () {alert (this.name); }};3.4 Динамичность прототипов цепочек
Поскольку процесс поиска значений в прототипе является поиском, любые модификации, внесенные в объект прототипа, отражаются на экземпляре. Но если весь объект прототипа переписывается, результат будет другим. При вызове конструктора указатель [[прототип]] на исходный прототип добавляется к экземпляру, и изменение прототипа на другой объект эквивалентен отрезку соединения между конструктором и исходным прототипом. Указатель в экземпляре указывает только на прототип, а не на конструктор.
function person () {} var boy = new Person (); person.prototype = {Constructor: Person, имя: "xxyh", возраст: 29, задание: "программист", sayname: function () {alert (this.name); }}; boy.sayname (); // ОшибкаКонкретный процесс заключается в следующем:
Как видно из вышеупомянутого, переписывание объектов прототипа сокращает связь между существующими прототипами и любыми ранее существующими экземплярами объекта; Они относятся к исходному прототипу.
3.5 Прототип нативного объекта
Все нативные ссылочные типы определяют методы на прототипе конструктора. Через прототип нативного объекта можно получить не только метод по умолчанию, но и новый метод также можно определить.
String.prototype.startswith = function (text) {return this.indexof (text) == 0;}; var msg = "Доброе утро"; alert (msg.startswith ("good")); // истинный3.6 Проблемы с прототипами объектов
Есть две проблемы с шаблоном прототипа:
• Все одно и то же значение атрибута по умолчанию.
• Все атрибуты в прототипе разделяются экземпляром
Давайте посмотрим пример ниже:
function person () {} person.prototype = {Constructor: Person, имя: «xxyh», возраст: 18, Job: «Программист», друзья: ["Zhang San", "li si"], sayName: function () {alert (this.name); }}; var p1 = new Person (); var p2 = new Person (); p1.friends.push ("wang wu"); alert (p1.friends); // Zhang San, Li Si, Wang Wu Alert (P2.Friends); // Zhang San, Li Si, Wang Wu Alert (P1.Friends == P2.Friends); // истинныйПредмет был добавлен выше через P1.Friends. Поскольку массив друзей существует лично. Тем не менее, случаи, как правило, имеют все свои атрибуты.
Используйте режим конструктора и режим прототипа в комбинации
Режим конструктора используется для определения свойств экземпляра, а режим прототипа используется для определения методов и общих свойств. Таким образом, каждый экземпляр будет иметь свою собственную копию атрибутов экземпляра, но в то же время будет иметь ссылку на метод.
Функция человека (имя, возраст, задание) {this.name = name; this.age = возраст; this.job = job; this.Friends = ["Zhang San", "li Si"];} Person.prototype = {Constructor: Person, Sayname: function () {alert (this.name); }} var p1 = новый человек ("xiao xiao yihan", 18, "программист"); var p2 = новый человек ("kuiba", 10, "Monster Hunt"); P1.Friends.push ("wang wu"); alert (p1.friends); // Zhang San, Li Si, Wang Wu's Fort (P2.Friends); // Zhang San, Li Si Alert (P1.Friends == P2.Friends); // falsealSealert (p1.sayname == p2.sayname); // истинныйВ приведенном выше примере свойства экземпляра определены в конструкторе, в то время как в прототипе определены конструктор общего свойства и метод SayName (). Модификация P1.Friends не повлияет на результаты P2.Friends.
Динамический режим прототипа
Динамический шаблон прототипа инкапсулирует всю информацию в конструкторе, и, инициализируя прототип в конструкторе, он сохраняет преимущество использования как конструктора, так и прототипа. То есть можно определить, должен ли прототип быть инициализирован, проверяя, эффективен ли метод, который должен существовать.
Функция человека (имя, возраст, задание) {// Собственность this.name = name; this.age = возраст; this.job = job; // метод if (typeof this.sayname! = "Function") {person.prototype.sayname = function () {alert (this.name); }}}Это будет добавлено только в прототип только тогда, когда метод sayname () не существует, и будет выполняться только тогда, когда конструктор вызовов в первый раз.
Паразитный конструктор
Идея этого шаблона состоит в том, чтобы создать функцию, чья функция заключается в том, чтобы инкапсулировать код, который создает объект, а затем вернуть недавно созданный объект.
Функция Person (имя, возраст) {var obj = new Object (); obj.name = name; obj.age = возраст; obj.sayname = function () {alert (this.name); } return obj;} var boy = new Person ("xxyh", 19, "Progrommer"); Boy.sayname ();Следует отметить: во -первых, возвращенный объект не имеет отношения с конструктором или атрибутами прототипа конструктора; Объект, возвращаемый конструктором, ничем не отличается от объекта, созданного вне конструктора. На экземпляре оператора нельзя полагаться, чтобы определить тип объекта.
Стабильный конструктор
Безопасный объект относится к объекту, который не имеет общедоступных атрибутов, и его методы не относятся к этому. Стабильные конструкторы следуют аналогичному паттерну с паразитными конструкторами, но есть два различия:
• Метод экземпляра недавно созданного объекта не ссылается на это;
• Конструктор не называется с помощью нового оператора
Перепишите конструктор человека следующим образом:
Функция человека (имя, возраст, задание) {var obj = new Object (); obj.sayname = function () {alert (name); }; вернуть obj;} Функция человека (имя, возраст, задание) {var obj = new Object (); obj.sayname = function () {alert (name); }; вернуть obj;}Приведенная выше статья кратко рассказывает о создании объектов JavaScript - это весь контент, которым я делюсь с вами. Я надеюсь, что это может дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.