Что ориентирован на объект? Объектно-ориентированный-это своего рода мысль! (ерунда).
Объектно-ориентированные могут рассматривать все ключевые модули в программе как объекты, а модули имеют атрибуты и методы. Таким образом, если мы инкапсулируем некоторые свойства и методы, будет очень удобно использовать в будущем, а также может избежать утомительной и повторяющейся работы. Далее мы объясним объектно-ориентированную реализацию в JS.
Заводская модель
Заводская паттерна-это хорошо известный шаблон проектирования в области разработки программного обеспечения, и, поскольку классы не могут быть созданы в ECMASCRICE, объекты создаются с помощью инкапсуляции функций. Метод реализации очень прост, то есть создать объект в функции, назначить атрибуты и методы объекту, а затем вернуть объект.
функция CreateBlog (name, url) {var O = new Object (); o.name = name; o.url = url; o.sayurl = function () {alert (this.url); } return o;} var blog1 = createBlog ('wuyuchang', '//www.vevb.com/');Можно видеть, что метод реализации заводского шаблона очень прост, решает проблему создания нескольких аналогичных объектов, но заводской шаблон не может идентифицировать тип объекта, потому что это все объект, в отличие от даты, массива и т. Д., Так что появляется шаблон конструктора.
Режим конструктора
Конструктор в Ecmascript может создавать объекты определенных типов, аналогичные собственным объектам JS, таким как массив и дата. Метод реализации выглядит следующим образом:
Функциональный блог (имя, url) {this.name = name; this.url = url; this.alerturl = function () {alert (this.url); }} var blog = new Blog ('wuyuchang', '//www.vevb.com/');console.log(blog exanceof blog); // true, определите, является ли блог экземпляром блога, то есть он решает проблему, которой не может быть заводский режимЭтот пример отличается от заводской модели, за исключением названия функции, осторожная детская обувь должна найти много различий:
Первая буква имени функции капитализируется (хотя стандарт не предусматривает, что первая буква капитализируется, согласно Конвенции, первая буква конструктора капитализируется.
Создать объект, не отображаемый
Назначьте атрибуты и методы непосредственно этому объекту
Нет оператора возврата
Создать объект, используя новый
Уметь распознавать объекты (именно здесь шаблоны конструктора перевешивают заводские модели)
Хотя конструкторы просты в использовании, они не без недостатков. Самая большая проблема с использованием конструкторов заключается в том, что они должны воссоздать метод каждый раз, когда они создают экземпляр (теоретически, свойства объекта различаются каждый раз, когда они создают объект, а методы объекта одинаковы). Тем не менее, нет необходимости создавать ровно один и тот же метод дважды, поэтому мы можем перемещать функцию вне объекта (возможно, некоторые детские туфли видели недостатки, Shhhhh!).
Функциональный блог (имя, url) {this.name = name; this.url = url; this.alerturl = alerturl;} function alerturl () {alert (this.url);} var blog = new Blog ('scjb51', 'http://sc.vevb.com/'), blog2 = новый блог ('jb51', '//www.vevb.com/'); blog // http://sc.vevb.com/blog2.alerturl (); // //www.vevb.com/Мы установили Alerturl для глобальной функции, чтобы блог и блог2 получали доступ к одной и той же функции, но проблема возникает снова. Функция, которая на самом деле хочет использовать блог, определяется в глобальной области, которая показывает, что глобальная область несколько достойна его имени. Что еще более неприемлемо, так это то, что в глобальном объеме определяются многие методы, которые используются только конкретными объектами. Это не только потраченное впустую пространство, но и теряет объектно-ориентированную инкапсуляцию, поэтому эта проблема может быть решена с помощью прототипов.
Прототип режим
Каждая функция, которую мы создаем, имеет атрибут прототипа, который является указателем на объект, и цель этого объекта состоит в том, чтобы содержать свойства и методы, которые могут быть переданы всеми экземплярами определенного типа. Преимущество использования объектов прототипа заключается в том, что все экземпляры объектов могут использовать свойства и методы, которые он содержит.
Function blog () {} blog.prototype.name = 'wuyuchang'; blog.prototype.url = 'http://tools.vevb.com/'; blog.prototype.friend = [' fr1 ',' fr2 ',' fr3 ',' fr4 ']; blog.prototype. this.friend);} // Ниже приведен тестовый код var blog = new Blog (), blog2 = new Blog (); blog.alertinfo (); // wuyuchanghttp: //tools.vevb.com/fr1,fr2,fr3,fr4blog2.alertinfo (); // wuyuchanghttp: //tools.vevb.com/fr1,fr2,fr3,fr4blog.name = 'wyc1'; blog.url = 'http: //***.com'; blog.friend.pop (); blog2.name = 'wyc2'; blog2.url = 'http: //+; блог. // wyc1http: //***.comfr1,fr2,fr3blog2.alertinfo (); // wyc2http: //++.comfr1,fr2,fr3Паттерн прототипа не без недостатков. Прежде всего, он опускает связь конструктора, проходящего параметры инициализации. В результате все экземпляры получают одинаковое значение атрибута по умолчанию, что очень неудобно, но это не самая большая проблема прототипа. Самая большая проблема с моделью прототипа вызвана природой обмена. Благодаря обмену, один экземпляр изменяет ссылку, а другой также меняет ссылку. Поэтому мы обычно не используем прототипы в одиночку, но объединяем паттерны прототипа с паттернами конструкторов.
Смешанный режим (режим прототипа + режим конструктора)
Функциональный блог (имя, url, друг) {this.name = name; this.url = url; this.Friend = Friend;} blog.prototype.alertinfo = function () {alert (this.name + this.url + this.friend);} var blog = new Blog ('wuyuchang', 'http://tools.vevb.com/', ['fr1', 'fr2', 'fr3']), blog2 = new Blog ',' wyc ',' wyc ',' wyc ',' wyc ',' wyc ',' wyc ',' wyc ',' 'fr1', 'fr2', 'fr3']). 'http: //**.com', ['a', 'b']); blog.friend.pop (); blog.alertinfo (); // wuyuchanghttp: //tools.vevb.com/fr1,fr2blog2.alertinfo (); // wychttp: //**.coma,bВ гибридном режиме режим конструктора используется для определения атрибутов экземпляра, в то время как режим прототипа используется для определения методов и общих атрибутов. Каждый экземпляр будет иметь свой собственный атрибут экземпляра, но в то же время он разделяет методы, сохраняя память в максимальной степени. Кроме того, этот режим также поддерживает передачу начальных параметров. Много преимуществ. Этот шаблон является наиболее широко используемым и наиболее признанным методом создания пользовательских объектов в ECMASCRICT.
Динамический режим прототипа
Динамический режим прототипа инкапсулирует всю информацию в конструкторе и, инициализируя прототип в конструкторе (только прототип инициализируется при создании первого объекта), это позволяет вам выбрать, должен ли прототип быть инициализирован, оценивая, является ли метод действительным.
Функциональный блог (имя, url) {this.name = name; this.url = url; if (typeof this.alertinfo! = 'function') {// Этот код выполняется только один раз ('exe Time'); Blog.prototype.alertinfo = function () {alert (thia.name + this.url); }}} var blog = new Blog ('wuyuchang', 'http://tools.vevb.com'), blog2 = новый блог ('wyc', 'http: ***. com');Вы можете видеть, что в примере выше, окно появляется один раз, «время Exe», то есть, когда блог инициализируется, Blog2 не нужно инициализировать прототип. Для создания объектов, используя этот шаблон, его можно считать идеальным.
Этот пост в блоге относится к третьему изданию «JavaScript Advanced Programming», но язык был упрощен, и примеры были переписаны. Если у вас есть какие -либо вопросы, пожалуйста, оставьте сообщение и ответ, и автор обновит блог.