2013-03-17 10 views
2

Я пытаюсь выполнить пример JavaScript.Назначение «нового номера» для печати прототипов в качестве {} в Chrome

function A() {}; 

A.prototype.x = new Number(10); 

var a = new A(); 

console.log(a.x); 

В Firefox значение его печати равно 10, но в Chrome или Node.js его печатается как {}.

Но когда вторая строка, как показано ниже, то она печатает 10 в хроме также

A.prototype.x = 10; 

Может кто-нибудь объяснить мне причину, почему новый номер (10) не работает в хроме.

+1

'console.log' снова выигрывает: Сравните с' console.log ("" + a.x) '. – 2013-03-17 01:25:43

ответ

2

Это потому, что вы делаете объект-оболочку Number вместо примитива, и это выбранное вами Chrome. (Консольные представления не всегда совпадают. Там нет стандартных.)

Фактическое число 10 хранится во внутренней собственности под названием [[PrimitiveValue]], так что это не прямой контакт.

Чтобы получить его [[PrimitiveValue]], вы можете использовать метод .valueOf().

console.log(a.x.valueOf()); // 10 

15.7.2.1 new Number ([ value ])

[[Prototype]] внутреннее свойство создаваемого объекта устанавливается равным исходному объекту номер прототипа, тот, который начальное значение Number.prototype (15.7.3.1).

Внутреннее свойство [[Class]] новопостроенного объекта установлено в "Number".

[[PrimitiveValue]] внутреннее свойство создаваемого объекта устанавливается равным ToNumber(value), если значение было обеспечено, чтобы еще +0.

Внутреннее свойство [[Extensible]] новопостроенного объекта установлено в true.

2

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

Если вы напишете console.log(new Number(10)), вы увидите тот же результат.

Если вы изменили код для использования примитива (A.prototype.x = 10), он отобразит 10.

0

Потому что Number - это объект. console.log(a.x.valueOf()); или console.log(a.x.toString()); будет работать.