Почему числа не являются экземплярами Object, в то время как они наследуются от Object.prototype? - PullRequest
3 голосов
/ 18 мая 2019

См. Фрагмент ниже.

let num = 3;
Object.prototype.prop = "something";
console.log(num instanceof Object); //false;
console.log(num.hasOwnProperty('prop')) //false

console.log(num.prop) //'something'

Может кто-нибудь объяснить, почему num instanceof Object и num.hasOwnProperty('prop') возвращает false, но мы все же можем получить доступ к свойству Object.prototype для num

Ответы [ 3 ]

5 голосов
/ 18 мая 2019

Числа являются примитивами , поэтому они не наследуются от 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 выполняет фактическую упаковку.

0 голосов
/ 18 мая 2019

hasOwnProperty в MDN :

Метод hasOwnProperty() возвращает логическое значение, указывающее, имеет ли объект указанное свойство как собственное свойство ( в отличие от наследования ).

Выделение мое

Число наследует свойство, поэтому вы можете получить к нему доступ, нооно не определено как свойство самого числа, поэтому hasOwnProperty("prop") возвращает false.

И причина сбоя instanceof состоит в том, что он может использоваться только для явных объектов (созданных,или литералы).

0 голосов
/ 18 мая 2019

Только реальные объекты могут когда-либо разрешать свои instanceof значения true. См. спецификацию на instanceof, которая указывает на HasInstance:

Когда внутренний метод [[HasInstance]] для F вызывается со значением V, предпринимаются следующие шаги:

  1. Если V не является объектом, вернуть false.

Числа даже не instanceof Number:

console.log(1 instanceof Number);

Хотя, если вы используете new Number (что не следует) и создаете объект с действительным числом, он будет работать так, как вы ожидаете:

console.log(new Number(1) instanceof Number);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...