В чем разница между этим основанным на конструкторе синтаксисом для создания объекта:
person = new Object()
... и этот буквальный синтаксис:
person = {
property1 : "Hello"
};
Похоже, что оба делают одно и то же, хотя JSLint предпочитает использовать буквенное обозначение объекта.
Какой из них лучше и почему?
javascript
object
jslint
крайний тип телосложения
источник
источник
a = new Object
,a = new Object()
,a = {}
, буквальное гораздо проще и некоторые тесты я провел некоторое время назад сказать , что это быстрее, более новые компиляторы могут быть вызваны моим утверждение ложным. То же самое относится к буквенным массивамvar
ключевым словом в коде приложения, чтобы не загрязнять глобальное пространство имен и создавать необходимость поиска переменных переменных за пределами текущей записи в стеке.new
- это соглашение, которое выходит за рамки бессмысленного придирки к посредственному языку. Используйте,new
потому что его значение понятно. В 99,9% случаев прирост производительности не имеет значения.Ответы:
Они оба делают одно и то же (если кто-то не сделал что-то необычное), за исключением того, что ваш второй создает объект и добавляет к нему свойство. Но буквенная запись занимает меньше места в исходном коде. Понятно, что происходит, поэтому, используя
new Object()
, вы на самом деле просто набираете больше и (теоретически, если не оптимизируется движком JavaScript) выполняете ненужный вызов функции.Эти
технически не делайте то же самое. Первый просто создает объект. Второй создает один и назначает свойство. Чтобы первый был одинаковым, вам потребуется второй шаг для создания и назначения свойства.
«Что-то необычное», что кто-то может сделать, это скрыть или назначить
Object
глобальный по умолчанию :В этом крайне необычном случае
new Object
не{}
получится, но сработает.На практике никогда не бывает причин использовать,
new Object
а не{}
(если вы не сделали эту очень необычную вещь).источник
()
new Object()
не требуется. (говорим о не обязательных вещах)Для простого объекта без методов нет разницы, как в вашем примере. Однако есть большая разница, когда вы начинаете добавлять методы к вашему объекту.
Буквальный путь:
Способ прототипа:
Оба способа позволяют создавать экземпляры
Obj
вроде этого:Тем не менее, в буквальном смысле, вы несете копию
sayHello
метода в каждом экземпляре ваших объектов. Принимая во внимание, что при использовании способа прототипа метод определяется в прототипе объекта и используется всеми экземплярами объекта. Если у вас много объектов или методов, буквальный путь может привести к довольно большой трате памяти.источник
new Object()
vs{}
для создания пустых объектов.В JavaScript мы можем объявить новый пустой объект двумя способами:
Я не нашел ничего, что могло бы предположить, что есть какая-то существенная разница между этими двумя в том, как они работают за кулисами (пожалуйста, поправьте меня, если я ошибаюсь - я хотел бы знать). Однако второй метод (с использованием буквенной нотации объекта) предлагает несколько преимуществ.
Рассмотрим новый объект, который содержит члены Name и TelNo. Используя новое соглашение Object (), мы можем создать его следующим образом:
Функция Expando Properties в JavaScript позволяет нам создавать новых участников таким образом на лету, и мы достигаем того, что намеревались. Однако этот способ не очень структурирован и не заключен в капсулу. Что если мы захотим указать членов при создании, не полагаясь на свойства expando и назначение после создания?
Вот где могут помочь буквенные обозначения объекта:
Здесь мы добились того же эффекта в одной строке кода и значительно меньше символов.
Дальнейшее обсуждение методов конструирования объектов выше можно найти по адресу: JavaScript и объектно-ориентированное программирование (ООП).
И, наконец, что за идиот, который отверг Объект? Вы думали, что это невозможно? Ну, этот JSFiddle доказывает обратное. Использование буквенных обозначений объекта не позволяет нам осквернить эту буффонаду.
(С http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/ )
источник
new Object()
из-за вероятности того, что что-то перезаписало функцию объекта, вы также должны повсеместно писать охранников, когда используете помощников, например,Object.keys
чтобы убедиться, что они не определены, что приводит к абсурду. Я всегда рекомендовал бы людям использовать буквальную запись, но я думаю, что этот конкретный аргумент разваливается, когда вы думаете о последствиях такого мышления.На моей машине с помощью Node.js я запустил следующее:
Обратите внимание, это расширение того, что находится здесь: почему arr = [] быстрее, чем arr = new Array?
мой вывод был следующим:
так ясно, что {} и [] быстрее, чем использование new для создания пустых объектов / массивов.
источник
Все здесь говорят о сходстве двух. Я собираюсь указать на различия.
Использование
new Object()
позволяет передавать другой объект. Очевидным результатом является то, что вновь созданный объект будет установлен на ту же ссылку. Вот пример кода:Использование не ограничено объектами, как в объектах ООП. Другие типы могут быть переданы ему тоже. Функция установит тип соответственно. Например, если мы передадим ему целое число 1, для нас будет создан объект типа номер.
Объект, созданный с использованием вышеуказанного метода (
new Object(1)
), будет преобразован в тип объекта, если к нему добавлено свойство.Если объект является копией дочернего класса объекта, мы могли бы добавить свойство без преобразования типа.
источник
str
имеет тип,string
поэтому вы не можете назначить ему свойство. jsfiddle.net/grq6hdx7/1var obj = new Object("foo"); typeof obj; obj === "foo" // true
На самом деле, есть несколько способов создания объектов в JavaScript. Когда вы просто хотите создать объект, нет смысла создавать объекты на основе конструктора, используя оператор « new ». Это то же самое, что создание объекта с использованием синтаксиса « object literal ». Но « основанные на конструкторе » объекты, созданные с помощью оператора « new », находят невероятное применение, когда вы думаете о « наследовании прототипа ». Вы не можете поддерживать цепочку наследования с объектами, созданными с буквальным синтаксисом. Но вы можете создать функцию конструктора , прикрепить свойства и методы к ее прототипу.msgstr "Оператор возвращает объект, который будет иметь доступ ко всем методам и свойствам, связанным с прототипом этой функции конструктора.
Вот пример создания объекта с использованием функции конструктора (см. Объяснение кода внизу):
Теперь вы можете создать столько объектов, сколько захотите, создав экземпляр конструкторской функции Person, и все они унаследуют от нее fullname ().
Примечание. Ключевое слово « this » будет ссылаться на пустой объект в функции-конструкторе, и всякий раз, когда вы создаете новый объект из Person с помощью оператора « new », оно автоматически возвращает объект, содержащий все свойства и методы, связанные с ключевым словом « this ». , И эти объекты наверняка унаследуют методы и свойства, связанные с прототипом функции конструктора Person (что является основным преимуществом этого подхода).
Кстати, если вы хотите получить ту же функциональность с синтаксисом « object literal », вам придется создать fullname () для всех объектов, как показано ниже:
Наконец, если вы сейчас спросите, почему я должен использовать подход с использованием функции конструктора вместо объектного литерального подхода:
*** Прототип наследования позволяет простую цепочку наследования, которая может быть очень полезной и мощной.
*** Это экономит память путем наследования общих методов и свойств, определенных в прототипе функций конструктора. В противном случае вам придется копировать их снова и снова во всех объектах.
Я надеюсь это имеет смысл.
источник
Object.create(<object defined using literal notation>)
илиnew Object(<object defined using literal notation>)
создавать цепочки наследования по мере необходимости.function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } Person.prototype.fullname = function() { console.log(this.firstname + ' ' + this.lastname); } var zubaer = new Person('Zubaer', 'Ahammed'); var john = new Person('John', 'Doe'); zubaer.fullname(); // Zubaer Ahammed john.fullname(); // John Doe zubaer.constructor.prototype.fullname = function() { console.log( 'Hello ' + this.firstname); } zubaer.fullname(); // Hello Zubaer john.fullname(); // Hoello John
Кроме того, согласно некоторым книгам О'Рейли на JavaScript ... (цитируется)
Другая причина использования литералов в отличие от конструктора Object - отсутствие разрешения области видимости. Поскольку возможно, что вы создали локальный конструктор с тем же именем, интерпретатору необходимо искать цепочку областей действия от места, где вы вызываете Object (), до тех пор, пока он не найдет глобальный конструктор Object.
источник
Я нашел одно отличие, для ES6 / ES2015. Вы не можете вернуть объект, используя синтаксис функции сокращенной стрелки, если не окружите объект
new Object()
.Это потому, что компилятор смущен
{}
скобками и думает, чтоn: i
это метка: оператор construct; точка с запятой необязательна, поэтому не жалуется на это.Если вы добавите другое свойство к объекту, оно, наконец, выдаст ошибку.
источник
[1, 2, 3].map(v => { return {n: v}; });
вы получите одно и то же ...param => return_value
Разница между использованием{}
иnew Object()
в этом случае.[1, 2, 3].map(v => ({n: v}));
2019 Обновление
Я выполнил тот же код, что и @rjloura, на моем узле OSX High Sierra 10.13.6 версии 10.13.0, и вот результаты
источник
Использование памяти отличается, если вы создаете 10 тысяч экземпляров.
new Object()
останется только одна копия, а{}
будет 10 тысяч копий.источник
new
создает новый объект. Они оба занимают одинаковое количество памяти.