Ответ 1
Никто на самом деле не объяснил, почему это не работает. Если мы посмотрим на последнюю спецификацию, функция Object
определяется следующим образом:
19.1.1.1 Объект ([значение])
Когда вызывается функция
Object
с дополнительнымvalue
, выполняются следующие шаги:
- Если
NewTarget
является ниundefined
ни активной функцией, тогда
- Вернуть?
OrdinaryCreateFromConstructor(NewTarget, "%ObjectPrototype%")
.- Если
value
равноnull
,undefined
или неObjectCreate(%ObjectPrototype%)
, вернитеObjectCreate(%ObjectPrototype%)
.- Вернуть !
ToObject(value)
.
Первый шаг - важный здесь: NewTarget
ссылается на функцию, которую вызывали new
. Поэтому, если вы создадите new Object
, это будет Object
. Если вы new ExtObject
это будет ExtObject
.
Поскольку ExtObject
не является Object
("ни активная функция"), условие соответствует, а OrdinaryCreateFromConstructor
оценивается и возвращается его результат. Как вы можете видеть, ничего не делается со value
переданным функции.
value
используется, только если ни 1., ни 2. не выполняются. И если value
является объектом, оно просто возвращается как есть, новый объект не создается. Таким образом, new Object(objectValue)
фактически совпадает с Object(objectValue)
:
var foo = {bar: 42};
console.log(new Object(foo) === foo);
console.log(Object(foo) === foo);