Числа являются примитивами , поэтому они не наследуются от Object
и не являются instanceof
ничем.
Тем не менее, Javascript поместит число в Number
объект, когда вы пытаетесь получить доступ к свойству (например, методу), так что этот доступ к свойству фактически находится на объекте Number
, который был создан на лету.Это как вы сделали:
console.log((new Number(num)).constructor.name);
console.log((new Number(num)).hasOwnProperty('prop'));
console.log((new Number(num)).prop):
prop
будет найден в цепочке прототипов объекта Number
, но hasOwnProperty
- как следует из названия - не не посмотрите на цепочку прототипов, и поэтому не будете учитывать то, что вы положили на Object.prototype
.
Обратите внимание, что этот тихий бокс не происходит, когда вы не пытаетесь получить доступ к свойству, поэтому в num instanceof
рассматривается примитив, а не его вариант Number
.
На самом деле вы можете увидеть след этого бокса, вызвав метод toSource
:
let num = 5;
console.log(num.toSource());
Забавный факт: этот бокс можно получить также с числом литерал - ему нужна вторая точка для устранения неоднозначности от десятичной точки:
console.log(1..toSource());
Спецификация «бокса»
Спецификация EcmaScript определяет этот процесс в разделе Свойства доступа .Оценка основывается на
GetValue(propertyNameReference).
Что, в свою очередь, имеет это в своем процессе определение :
If IsPropertyReference(V) is true, then
If HasPrimitiveBase(V) is true, then
Assert: In this case, base will never be undefined or null.
Set base to ! ToObject(base).
И наконец ToObject
выполняет фактическую упаковку.