我正在尝试理解写m = Number()
(导致typeof m
评估为"number"
)与m = new Number()
(导致typeof m
评估为"object"
)。
我原本预计它会成为object
。我只是搞乱了,我在.helloWorld()
原型中添加了Number
方法,无论使用哪种方法实例化它,我都可以在m
上访问它。
这有什么区别?在撰写Number()
和new Number()
之间,我在做什么?为什么一个是object
而另一个是number
?
答案 0 :(得分:4)
Number()
本身返回一个数字原语。当您致电new Number()
时,您会收到一个代表Number
(relevant ES5 spec)的对象的新实例。
当您在基元上调用属性时,该基元会自动装箱(就像在Java中一样)到该对象的实例,这样您就可以在helloWorld()
上调用object
或number
。
然而,试试这个;
var x = Number(5);
x.bar = function (x) { alert(x); };
x.bar("hello");
var y = new Number(5);
y.bar = function (x) { alert(x); };
y.bar("hello");
你会看到后者有效但前者没有;在第一个中,number
被自动装箱到一个数字,并且bar
方法被添加到它(对象)。当您致电x.bar()
时,您正在创建新自动装箱号码,bar
不存在。
在后者中,您将向该Number实例添加bar
方法,该方法的行为与任何其他Object实例相同,因此它在对象的整个生命周期中都会持续存在。
答案 1 :(得分:3)
这就是它的实施方式。在没有new
的情况下调用时,此特定构造函数返回原始数字。使用new
调用时,它将返回对象包装的数字。
您可以在基元上访问原型方法/属性,因为在幕后,JavaScript会将它们转换为对象,调用原型方法,然后抛弃对象副本。这允许您执行以下操作:
var myString = "foo";
console.log( myString.length ); //=> 3
console.log( typeof myString ); //=> "string"
在第2行创建基元的对象副本,检查对象的length属性,然后丢弃对象副本。 myString
保留为字符串原语。