2

Почитав десяток другой статей об ООП в JS попытался подытожить то, что понял.

Получается создавая переменную let i = 3 конструктор берет свойства и методы из прототипов объекта number?

Или что-то не так?

2 Answers2

4

При необходимости вызова метода относительно примитива интерпретатор заворачивает значение в объект-обертку, результатом может быть другой примитив, а на временную "обертку" не остается никаких ссылок и сборщик мусора ее чуть позже где-то в тишине прикончит...

То есть 0.004.toFixed(2) неявно превратится в (new Number(0.004)).toFixed(2).

free_ze
  • 8,656
  • в зависимости от реализации временной обертки может и не быть – Grundy Apr 28 '18 at 16:46
  • @Grundy, это поведение никак не закреплено в стандарте? Смог найти лишь косвенные отсылки, вроде вызова от null/undefined – free_ze Apr 29 '18 at 09:58
  • Стандарт описывает семантику, это не совсем то же самое что жесткое руководство по реализации. По моему тут был где-то ответ, про v8 – Grundy Apr 29 '18 at 18:30
  • @free_ze, стандарт описывает отсутствие обёртки в strict-режиме. https://ru.stackoverflow.com/a/435547/178988 – Qwertiy May 12 '18 at 23:48
  • @Qwertiy, только для значений null/undefined, как я и говорил - это в спеке есть) Интересуют остальные случаи или хотя бы умолчательное поведение. – free_ze May 14 '18 at 08:14
0

Конструктор ниоткуда ничего не берёт.

При обращении к свойствам и методам срабатывает стандартная схема поиска по цепочке прототипов. Когда метод находится, в зависимости от того, написан ли он в строгом режиме, число либо оборачивается в объект, либо передаётся в this как есть.

Впрочем, некоторое время назад некоторые браузеры были неприспособлены к такому поведению и выполняли обёртывание в объект всегда. Кажется, сейчас везде исправлено.

var a = 1, b = Number(2), c = new Number(3)

console.log(typeof a, typeof b, typeof c)

Number.prototype.nonStrictFunc = function () { return this }

Number.prototype.strictFunc = function () { 'use strict' return this }

console.log(typeof a.nonStrictFunc(), typeof b.nonStrictFunc(), typeof c.nonStrictFunc()) console.log(typeof a.strictFunc(), typeof b.strictFunc(), typeof c.strictFunc())

Qwertiy
  • 123,725