Литералы объекта
синтаксис:
Здесь я использую синтаксис (figure01) object literal для определения объекта person. эти фигурные скобки, мы называем их литералом синтаксиса объекта. Объект в JavaScript — это, по сути, набор пар ключ-значение. этот объект-человек имеет три члена: возраст, рост, есть, если функция-член, на которую мы ссылаемся, является методом, здесь мы говорим, что есть метод, эти другие члены являются свойствами. теперь в некоторых руководствах по Javascript и других материалах все эти элементы называются свойствами, независимо от того, являются они функциями или нет. на мой взгляд, технически в объектно-ориентированном программировании свойства и методы принципиально отличаются из-за свойств, используемых для временного хранения значений. функция или метод используются для определения некоторой логики. у нас есть объект person, мы можем получить доступ к его членам, используя запись через точку.
Фабрики
Теперь давайте представим, что мы хотим создать другого человека с текущей реализацией, нам нужно продублировать весь этот код (рисунок объекта человека)
это может быть проблемой, если у нас есть один или несколько методов в нашем объекте, в этом случае у нас есть метод eat и представьте, что мы продублировали его в двух разных местах, если они есть, это ошибка в этом методе, вы должны вернуться и исправить ее в нескольких местах. Теперь это очень простой объект, представьте, если бы у объекта человека было 10 или 20 методов, на мой взгляд, синтаксис литерала объекта не является хорошим способом создать объект и дублировать его, если этот объект имеет хотя бы один метод. объект имеет один или несколько методов, мы говорим, что объект имеет поведение
Функция конструктора
Другой способ создать объект с помощью функции-конструктора, определить функцию, но соглашение об именах, которое мы используем для функции-конструктора, отличается. первая буква должна быть в верхнем регистре, поэтому мы называем ее Человеком с заглавной буквы. Разработчики, имеющие опыт работы с такими языками, как С# и Java, выглядят как класс. но, как видите, я определил функцию. в javaScript у нас нет концепции классов, наша функция Person будет принимать параметры возраста и роста, но в теле вместо возврата объекта я использовал этоключевое слово для установки свойств этого объекта, что это за ключевое слово, это в основном ссылка на объект, который выполняет этот фрагмент кода. здесь я использую новый оператор для вызова функции Person и передачи двух параметров в качестве аргументов при использовании нового оператора, под капотом происходит несколько вещей. Этот новый оператор создаст пустой объект, он установит этоуказывать на этот объект, потому что по умолчанию этотуказывает на глобальный объект, если вы запускаете этот код в браузере, глобальным объектом является объект окна. если вы запускаете его в среде узла, глобальный объект является глобальным, позвольте мне показать на рисунке 06.
в соответствии с этим, является ли этот человек объектом здесь, и у нас есть три члена, возраст, рост и рисунок. это потому, что мы используем здесь оператор new. если я удалю новый оператор, позвольте мне показать вам, что происходит на рисунке 07
Теперь this ссылается на объект Windows. это глобальный объект в браузере. мы не хотим использовать это, мы не хотим связываться с этим. мы не хотим определять глобальные переменные, потому что это плохая практика, потому что они доступны везде в приложении. возможно ли, что та или иная функция случайно изменит значение этих переменных и создаст ошибку в нашем приложении. когда мы используем новый оператор для вызова функции, происходят три вещи: сначала этот новый оператор создаст пустой объект. он установит this так, чтобы он указывал на этот объект, и, наконец, он вернет этот объект из этой функции человека. обратите внимание, что здесь у нас нет явного оператора возврата, вы не возвращаете, это произойдет автоматически, когда мы используем новый оператор
в основном, у нас есть два способа создать объект. мы можем использовать фабричную функцию или конструктор. в этом нет ничего особенного, обе они являются обычными функциями в javaScript. Если вы возвращаете объект, мы ссылаемся на фабричную функцию. Напротив, если мы используем ключевое слово this вместе с новым оператором, на который вы ссылаетесь. функция как функция-конструктор, теперь вы думаете, в чем разница между этими двумя шаблонами при создании объекта, какой подход вы должны использовать? это действительно зависит от того, кого вы спросите. разработчики новых языков, таких как C# и java, предпочитают синтаксис функции конструктора, потому что это похоже на создание экземпляра класса, но опять же, в javaScript у нас нет классов. другим разработчикам такой подход не нравится, они предпочитают использовать фабричную функцию, и один из их аргументов — что, если разработчик забудет использовать здесь оператор new? затем мы определяем эти методы свойства объекта person для глобального объекта, которым в данном случае является объект окна, но этот аргумент действительно устарел. с современным javaScript и доступными нам инструментами мы получим ошибку, если забудем использовать здесь новый оператор. на мой взгляд, вы не должны зацикливаться на этом религиозном споре о фабриках и функциях конструктора. как разработчик, вы должны быть знакомы с обоими этими шаблонами, потому что, когда вы работаете над разными проектами в разных командах, вы увидите оба этих шаблона для создания объекта, вы должны понимать, как они работают, выберите шаблон, который вы предпочитаете.