我有一个第三方库,可以通过new
运营商来吸引:
var foo = new bar();
有效。此外,我可以使用window
对象,它也有效:
var foo = window.bar();
第一和第二路之间有什么区别吗?
如果这个问题被贬低是可以的,但我需要一些起点来学习这些东西。
答案 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
关键字在返回所有对象后绑定到此对象。