Защо, когато изпълнявам този оператор на JavaScript, който създава нов обект Number (с помощта на оператора new), резултатът е различен в Chrome и FireFox?

Аз съм доста нов в JavaScript и имам следното съмнение: правя някакъв експеримент с концепцията за вграден конструктор на функции.

Така че се опитвам да създам нов обект Number с помощта на оператора new.

Ако отворя Chrome Developer Tools и в Console изпълня следното изявление:

var a = new Number(3);
undefined
a;
Number {[[PrimitiveValue]]: 3}

както можете да видите, първо създавам нов обект Number с помощта на оператора new и след това изпълнявам този обект и получавам неговата стойност: Number {[[PrimitiveValue] ]: 3}

Проблемът е, че ако направя същото нещо във FireBug в FireFox, получавам нещо различно, получавам това:

var a = new Number(3);
undefined
a;
Number {}

И така, използвайки FireFox, правейки същото нещо, изглежда, че създаваме обекта Number, но този обект е празен и не съдържа 3 стойност, както е направено в Chrome.

Защо? Как е възможно? какво ми липсва

Друго съмнение е свързано с това как точно работи предишното създаване на обект, когато изпълнявам:

var a = new Number(3);

Добре, използвам концепцията за функционална конструкция, свързана с оператора нов. От това, което знам (но ме поправете, ако правя грешно твърдение), когато изпълнявам функция, използвайки оператора new, се случва, че:

  1. Създава се нов празен обект. Така че в този случай се създава нов обект Number, който трябва да означава JavaScript обект, който има променливата proto, зададена на препратката към Number обект, така че този обект ще има достъп до всички методи, дефинирани за Number (следвайки прототипната концепция за наследяване, реализирана от JavaScript).

  2. Променливата this, поставена в контекста на изпълнение на тази функция, се настройва на препратката към новосъздадения обект.

  3. Параметърът се използва за задаване на свойството на обекта. Така че в този случай стойността ще бъде 3.

Защо, когато правя:

var a = new Number(3);

Получавам недефинирана стойност? Може да зависи от факта, че тази функция Number не връща никаква стойност?

Разсъжденията ми правилни ли са или пропускам нещо?


person AndreaNobili    schedule 31.12.2015    source източник
comment
Най-добрият начин да разберете това е да разгледате спецификацията на JavaScript за типа Number. Не съм го чел от известно време, но доколкото разбирам, имаше малко място за интерпретация при внедряването на примитивни типове като този. Просто имайте предвид, че има разлика в концепцията на по-високо ниво на примитивните типове като екземпляри на обекти и действителната реализация.   -  person nbering    schedule 31.12.2015
comment
Защото не правете това. В JavaScript никога не трябва да използвате конструктора Number. Просто декларирайте var a = 3; и сте готови.   -  person Robusto    schedule 31.12.2015


Отговори (2)


тъй като Niet вече отговори за различната реализация на конзолата по различни начини.

Тази част от твоето твърдение е грешна

Създава се нов празен обект. Така че в този случай се създава нов обект Number, който трябва да означава JavaScript обект, който има proto променливата, зададена на препратката към обекта Number, така че този обект ще има достъп до всички методи, дефинирани за Number

__proto__(нестандартен) ще бъде зададен на Number.prototype, а не на Number.

person Ramanlfc    schedule 31.12.2015
comment
Добре, защото Number.prototype какво точно съдържа? всички методи, които едно число може да използва? - person AndreaNobili; 31.12.2015
comment
Number.prototype е действителният обект, вашият обект наследява свойства от . всички методи като toFixed() идват от това - person Ramanlfc; 31.12.2015
comment
Разбирам, че моят обект наследява от Number.prototype. Но защо от него, а не от Number? Какво съдържа? - person AndreaNobili; 31.12.2015
comment
Number е просто функция (самата тя е обект), тя използва своя prototype (не __proto__), за да настрои връзката __proto__ на обекта, когато се създават обекти. прочетете тази страхотна статия: pixelstech.net/article/ - person Ramanlfc; 31.12.2015

Начинът, по който обектите се представят в конзолата, зависи от изпълнението. Докато Chrome разкрива стойността на числото, това няма нищо общо със самия обект, а по-скоро как Chrome го изплюва обратно.

Ще забележите, че a.valueOf() ще върне 3 и в двата случая.

Като настрана, IE показва: [object Number] {}

person Niet the Dark Absol    schedule 31.12.2015