2015-10-06 29 views
0

我无法理解为什么new关键字是javascript API对象/接口功能的兼容性。javascript新功能的JavaScript关键字是否可选?

d = new String(); // javascript native object 
d2 = String(); 
console.log(d); 
console.log(d2); 

导致控制台(这似乎倒也正常):

String {} 
(an empty string) 

但:

b = new Blob(); // API object 
b2 = Blob(); 
console.log(b); 
console.log(b2); 

结果:

Blob { size=0, constructor=function(), type="", more...} 
Blob { size=0, constructor=function(), type="", more...} 

,而不是:

Blob { size=0, constructor=function(), type="", more...} 
Blob() is undefined or (an empty blob) 

这一切都工作得很好,但我很好奇......

+2

我想那些只是内在他们的'新'实例,如果你省略它。使你自己的工厂功能,并尝试相同的。 – vsync

+1

用'Date'和'new Date()'试试' – baao

+0

@vsync我会试试,谢谢 – TGrif

回答

0

这是一个在JS疣。有一些函数可以在内部构造对象并返回它们(不需要new),使用new的“构造函数”可以做到a bunch of magic

通常的建议是从来不写自己的类型,要求new,因为new需要的功能做的不错,但微妙的东西,如果你忽略它(具体而言,它们结合this全局对象,而不是一个新的对象,这样的实例变量实际上是全局变量,并且分配给实例成员clobbers全局变量)。如果您必须使用它们,JavaScript:Good Parts建议在名称中使用首字母大写,意思是“需要新的”,而其他所有字母都使用小写字母。

+0

它们都将对象添加到全局窗口中(也许是因为我的浏览器不是那么近期) – TGrif

+0

这不是关于是否该赋值被放置在全局'窗口'(通常情况下不用'var'声明的变量)。这是构造函数内部的赋值是否使用正在构造的新对象的'this'(使用'new')还是使用与this调用者相同的'this'(通常是全局'window',尽管并非总是)。如果我定义'var Foo = function(x){this.ab = x; }',然后做'var f1 = new Foo(“123”);''然后'f1'是一个新的对象,其属性'ab'设置为''123“'。如果我忘了'new',那么'f1'是'undefined',并且有一个全局'ab'设置为''“123”'。 – ShadowRanger

+0

通过对比,一个并非设计为使用'new'的类构造函数将在内部完成所有工作,并返回新构造的对象;它不依赖'new'来使它成为一个特殊的'this'。由于这两种形式大多不相容,所以您必须选择,非“新”形式更加灵活,并且在滥用时不会出现令人惊讶的副作用。 – ShadowRanger