使用“new”运算符与使用“window”对象

时间:2017-02-26 16:49:46

标签: javascript

我有一个第三方库,可以通过new运营商来吸引:

var foo = new bar();

有效。此外,我可以使用window对象,它也有效:

var foo = window.bar();

第一和第二路之间有什么区别吗?

如果这个问题被贬低是可以的,但我需要一些起点来学习这些东西。

2 个答案:

答案 0 :(得分:3)

  

第一和第二路之间有什么区别吗?

是的,他们非常不同。

如果bar打算用作构造函数

第一种方式是正确的,第二种方式是错误的。

第一种方式,new创建一个新对象(使用bar.prototype作为其原型),然后调用bar并设置this来引用新对象。 bar然后可以使用它想要添加的任何实例属性填充对象:

this.something = 42;

第二种方式,您直接调用bar,因为您是从属性访问者(window.bar)执行此操作,this调用bar时设置为window。没有创建新对象,this引用的对象(window)没有bar.prototype作为其原型。然后,如果bar添加任何实例属性,则创建全局变量,因为在窗口对象上创建属性正在创建全局变量。

所以:使用第一个。不要使用第二个。

如果bar 意味着用作构造函数

然后他们可能都错了,你应该只使用bar();,虽然window.bar();会好的,只会产生误导。

答案 1 :(得分:-1)

虽然使用new关键字来调用functions中的constructor mode,但您仍然可以正常调用此函数,如果它是这样编写的,它可以使用{new {1}}关键字。

注意

当在构造模式中调用函数时,正在使用函数__proto__创建新的obejct.prototype和函数this关键字在返回所有对象后绑定到此对象。