慕仙4324424
2017-01-04 15:41
为什么要加var sideBar=new Sidebar()在最后,而且SideBar跟new Sidebar有什么区别?这一句真不懂。
问题1:
new Sidebar只是一个构造函数,他就像一个生产对象的工具,没人用他,他只会静静的躺在那里。加了括号()后,他变成了new Sidebar(),这个括号意味着他被调用了,他调用了会产生一个东西,我们称呼这个东西叫实例对象,实例对象拥有构造函数内定义的属性和方法。
但是我们生产出来了一个对象,总要有变量来接受他呀,所有我们var sidebar这个变量来接收new Sidebar()产生的对象。就像我们要 var str =‘abc’一样
如果你是使用 var sideBar = Sidebar(),这样不会创建实例对象,而是产生了全局变量,因为此时Sidebar里面一大堆this都是指向的window,你执行 var sideBar = Sidebar()就等于做了
window.state="opened";
window.el=document.....这样的
问题2:
如果你使用var sideBar = new Sidebar(),程序会做三件事情
1.创建了一个空对象sideBar
2.我们将这个空对象的proto成员指向了Sidebar函数对象prototype成员的对象
3.我们将Sidebar函数对象的this指针替换成sidebar,然后再调用Sidebar对象
如果你觉得这三件事情有些绕,你就可以理解成new这个关键字会创造一个对象,让这个对象来接受构造函数的实行和方法,而不是让window来接收。
所以忘记写new是很危险的事情,如何避免?很简单
在构造函数前加一个判断
if(!this instanceof Sidebar){//如果这个创建的对象不是sidebar类型的
return new Sidebar();//重新去创建
}
侧边栏信息展示效果
33650 学习 · 101 问题
相似问题