Я не понимаю, каким образом я должен создавать объект в javascript. Кажется, есть как минимум два пути. Один из них - использовать буквальную нотацию объекта, а другой - функции построения. Есть ли у одного преимущество перед другим?
javascript
чобо
источник
источник
Ответы:
Если у вас нет поведения, связанного с объектом (т.е. если объект является просто контейнером для данных / состояния), я бы использовал литерал объекта.
Примените принцип KISS . Если вам не нужно ничего, кроме простого контейнера данных, используйте простой литерал.
Если вы хотите добавить поведение к своему объекту, вы можете использовать конструктор и добавить методы к объекту во время построения или дать своему классу прототип.
Подобный класс также действует как схема для вашего объекта данных: теперь у вас есть своего рода контракт (через конструктор), какие свойства инициализирует / содержит объект. Свободный литерал - это просто аморфный блок данных.
У вас также может быть внешняя
verify
функция, которая действует на простой старый объект данных:Однако это неблагоприятно для инкапсуляции: в идеале все данные + поведение, связанные с сущностью, должны существовать вместе.
источник
this.fn = function ...
подход в конструкторе, каждый из ваших экземпляров объекта будет иметь свои собственные копии функций. Используя подход прототипа, вы присоединяете каждую функцию один раз и только один раз: они будут унаследованы экземплярами через прототипное наследование.По сути, это сводится к тому, нужно ли вам несколько экземпляров вашего объекта или нет; объект, определенный с помощью конструктора, позволяет иметь несколько экземпляров этого объекта. Объектные литералы - это, по сути, синглтоны с общедоступными переменными / методами.
источник
Другой способ создания объектов единообразным образом - использовать функцию, возвращающую объект:
Поскольку функции в JavaScript являются замыканиями, мы можем использовать частные переменные и методы и избегать их
new
.Из http://javascript.crockford.com/private.html о частных переменных в JavaScript.
источник
В приведенном ниже коде показаны три метода создания объекта: синтаксис литерала объекта, конструктор функций и
Object.create()
. Синтаксис литерала объекта просто создает объект на лету, и поэтому он__prototype__
являетсяObject
объектом, и он будет иметь доступ ко всем свойствам и методамObject
. Строго с точки зрения шаблона проектирования следует использовать простой литерал объекта для хранения одного экземпляра данных.Конструктор функции имеет специальное свойство с именем
.prototype
. Это свойство станет__prototype__
одним из объектов, созданных конструктором функции. Все свойства и методы, добавленные к.prototype
свойству конструктора функции, будут доступны для всех создаваемых им объектов. Конструктор следует использовать, если вам требуется несколько экземпляров данных или требуется поведение вашего объекта. Обратите внимание, что конструктор функции также лучше всего использовать, когда вы хотите смоделировать частный / публичный шаблон разработки. Не забудьте поместить все общие методы в.prototype
чтобы они не создавались в каждом экземпляре объекта.Создание объектов с
Object.create()
использованием литерала объекта в качестве__prototype__
объекта, созданного этим методом. Все свойства и методы, добавленные к литералу объекта, будут доступны всем объектам, созданным из него посредством истинного прототипного наследования. Это мой предпочтительный метод.источник
Object.create
функцию внутри литерала, он будет уникальным для каждого экземпляра?Это зависит от того, чем вы хотите заниматься. Если вы хотите использовать (полу) частные переменные или функции в своем объекте, функция-конструктор - это способ сделать это. Если ваш объект содержит только свойства и методы, подойдет литерал объекта.
Теперь метод
multiply5
вmyObj
иSomeLiteral
делать то же самое. Единственное отличие в том, что myObj использует частную переменную. Последнее может быть полезно в некоторых случаях. В большинстве случаев литерала объекта достаточно, и это хороший и чистый способ создания JS-объекта.источник
Вам нужен единственный экземпляр объекта для страницы - Literal.
Вы хотите просто передавать данные, такие как объекты DTO, просто GET SET: - Literal
Вы хотите создавать реальные объекты с поведением методов, несколько экземпляров - функция конструктора, следование принципам ООП, наследование: - функции конструктора.
Ниже приведено видео на YouTube, в котором подробно объясняется, что такое буквальное, что такое функции-конструкторы и чем они отличаются друг от друга.
https://www.youtube.com/watch?v=dVoAq2D3n44
источник
Используйте литерал объекта, он более понятен и лучше расширяется с введением начальных значений.
источник
Как упоминалось в https://www.w3schools.com/js/js_object_definition.asp
Также
источник
Объектно-ориентированный JavaScript Udacity
источник
На самом деле, мне кажется, у нас могут быть частные методы в объектных литералах. Рассмотрим код ниже:
Дело вкуса, но я предпочитаю использовать объектные литералы там, где это возможно.
источник
// Литерал объекта и конструктор объекта
источник