Когда вы пытаетесь обратится к свойству/методу примитивного типа, он оборачивается в объект (Number, String и.т.д.), выполняется ваш метод или возвращается свойство, после чего объект удаляется. Поэтому в this у методов всегда будет ссылка на "объект обертка". Этот как
let num = new Number(123);
num === 123; // false
num == 123; // true
typeof num; // object
UPD: в строгом режиме, this внутри метода будет примитивным типом number. Почему это так, пока не знаю, не могу найти в спецификации такого. Вероятно это потому, что в строгом режиме this не преобразуется автоматически (например в не строгом режиме, с null/undefined в глобальный объект). Пример
// не строгий режим
function func() {
console.warn(this);
}
func.call(100); // выведет [Number: 100] объект, т.е. есть преобразование
строгий
"use strict"
function func() {
console.warn(this);
}
func.call(100); // выведет 100, примитивный number. т.е. преобразования нет
Поэтому код и работает в вашей песочнице, т.к. там строгий режим включен по умолчанию.