2016-05-31 7 views
4

Я разговаривал с некоторыми профессионалами, которые работают с JavaScript в компании, и мне сказали, что создание экземпляра объекта с использованием new нецелесообразно, поскольку не использует глобальный объект {}, даже если я хочу пустой объект, например:Object.create ({}): Является ли это хорошей практикой?

var wrong1 = new Object(); 
var wrong2 = {}; 

Но самый правильный путь в соответствии с ними и стандартами компании, чтобы создать его так:

var correct = Object.create({}); 

Передача пустого объекта быть прототипом пустой объект кажется довольно переработанным, и, возможно, даже poseless.

Может кто-нибудь дать мне ответ на вопрос, почему это рекомендуется, а если нет, то почему? (возможные плюсы и минусы)

+5

Но не пропускает пустой объект буквально '{}' неправильно в соответствии с этими рекомендациями? Не будет ли 'Object.create (Object.create ({}))' лучше? ;) –

+0

Возможный дубликат [В чем разница между \ 'новой записью Object() \' и объектной литературой?] (Http://stackoverflow.com/questions/4597926/what-is-the-difference-between-new -object-and-object-literal-notation) – Oleg

+3

@ el.pescado - это хорошо, но это доказательство пули: 'function create() {return Object.create (create())}' –

ответ

6

Объект literal создаст объект со следующей цепочкой прототипов.

Object.prototype -> {} 

Литеральный синтаксис сильно оптимизирован большинством двигателей, потому что это такой общий шаблон.

Для сравнения Object.create({}) создает объект с более длинной прототипной цепью.

Object.prototype -> {} -> {} 

Экземпляр (на крайний справа) имеет прототип {}, который, как видно, прежде чем уже есть прототип Object.prototype.

Object.create - очень полезная функция для создания объектов с пользовательскими прототипами и не страдает теми же проблемами, что и new. Тем не менее, мы не нуждаемся в , потому что {} уже создает объект с более короткой прототипной цепочкой.

Я не знаю, почему кто-то мог подумать, что добавление этого дополнительного слоя косвенности (и потери производительности) было «лучшей практикой».

Во всяком случае, я бы сказал, что буквальный синтаксис был более безопасным, так как нет никакого способа для {} быть случайно/злонамеренно переопределенным, в отличие от Object, который может быть затенен.

var Object = 3; 
// ... 
Object.create({}) // TypeError: Object.create is not a function(...) 

Конечно, это не означает, что вы никогда не должны использовать Object, но в данном случае я думаю, что {} является самым простым инструментом для работы и, как результат, он имеет лучшую производительность тоже.

+0

У вас действительно хороший момент. «Объект» может быть затенен, а также функция «.create». –

+1

Я думаю, что кто-то был действительно анальным и решил, что если 'Object.create()' существует ... тогда он просто должен быть лучше – charlietfl

+0

Итак, по этому комментарию я могу предположить, что 'var a = {}' равно безопаснее, чем 'var b = new Object()'? –

Смежные вопросы