Фон
В проекте, который я поддерживаю, мы широко используем объекты нулевого прототипа как альтернативу бедному человеку (только для строкового ключа) Карты, которые не поддерживаются в большинстве старых браузеров до ES6.
В принципе, для создания нулевого объекта прототипа "на лету" можно использовать:
var foo = Object.create(null);
Это гарантирует, что новый объект не имеет наследуемых свойств, таких как "toString", "constructor", "__proto__", которые нежелательны для данного конкретного варианта использования.
Поскольку этот шаблон появляется несколько раз в коде, мы придумали идею создания конструктора, который будет создавать объекты, у прототипа которых есть нулевой прототип и нет собственных свойств.
var Empty = function () { };
Empty.prototype = Object.create(null);
Затем для создания объекта без собственных или унаследованных свойств можно использовать:
var bar = new Empty;
Проблема
В стремлении повысить производительность я написал тест и обнаружил, что нативный подход Object.create
неожиданно выполняет гораздо медленнее, чем метод, включающий дополнительный конструктор со специальным прототипом во всех браузерах: http://jsperf.com/blank-object-creation.
Я с энтузиазмом ожидал, что последний метод будет медленнее, поскольку он включает в себя вызов определяемого пользователем конструктора, чего не происходит в первом случае.
Что может быть причиной такой разницы в производительности?