Результат call
- это то, что возвращает функция. Ваш ObjConstructor
не ничего не возвращает , поэтому в результате его вызова undefined.
Напротив, когда вы используете new
, новый объект создается и передается функции, и если функция не возвращает объект, отличный от null
, объект, созданный для new
, является результатом new
выражение.
Вот почему версия new
работает, а call
- нет.
Также обратите внимание, что call
вообще не создает объект. В вашем ObjConstructor.call({})
объект создает {}
, а не call
. Он не будет иметь ObjConstructor.prototype
в качестве прототипа. ({}
является инициализатором необработанного объекта, поэтому объект будет иметь Object.prototype
в качестве прототипа.)