Почему прототипы вручную инициализируются, чтобы NULL все еще наследуют от объекта
-
22-10-2019 - |
Вопрос
Если я напишу это
var o = Object.create(null)
alert(o instanceof Object) // this is false
Почему это в конечном итоге будет правдой
function o() {
}
o.prototype = null
alert(new o() instanceof Object) // this is true
Не должно вручную настраивать прототип на NULL, заставляя его наследовать от ничего, как Object.Create. Заранее спасибо :-)
Решение
Вкратце, если прототип конструктора не является объектом, то приведены экземпляры Object.Prototype как их [[прототип]].
Деталь в ECMA-262, §13.2.2 [[Construct]]:
Когда внутренний метод [[Construct]] для функционального объекта F вызывается с возможным пустым списком аргументов, предпринимаются следующие шаги:
- Позволять obj Будьте недавно созданным нативным объектом Ecmascript.
- Установить все внутренние методы obj как указано в 8.12.
- Установить внутреннее свойство [[класс] obj к "Объект".
- Установить [[[расширяется]] внутреннее свойство obj к истинный.
- Позволять прото быть значением вызова [[get]] внутреннего свойства F с аргументом "прототип".
- Если тип (прото) объект, установите [[прототип]] внутреннее свойство objк прото.
- Если тип (прото) не объект, установите [[прототип]] внутреннее свойство obj к стандартному встроенному объектному объекту объекта, как описано в 15.2.4.
- Позволять результат быть результатом вызова [[Call]] внутреннего свойства Фланг, предоставление obj как это ценность и предоставление списка аргументов, передаваемого в [[Construct]] как Аргс.
- Если тип (результат) объект, затем вернуть результат.
- Возвращаться obj.
Отмечая, что в пунктах 6 и 7, null
тип NULL (ECMA-262 §8.2), это не то же самое, что typeof null
, который объект.
Другие советы
Когда вы создаете это так, он возвращает объект o
.
Его (скрытая) цепочка прототипа Все еще указывает на Object