js太差,这个都要问。。。。

来源:3-3 侧边栏对象--构造函数的验证

慕仙4324424

2017-01-04 15:41

为什么要加var sideBar=new Sidebar()在最后,而且SideBar跟new Sidebar有什么区别?这一句真不懂。

写回答 关注

1回答

  • 慕标4713339
    2017-01-08 12:40:31
    已采纳

    问题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();//重新去创建

    }


    慕仙4324...

    非常感谢!

    2017-01-08 13:27:22

    共 1 条回复 >

侧边栏信息展示效果

顶级大牛分享开发经验,学会实现侧边栏内容效果展示,让你迅速进阶

33650 学习 · 101 问题

查看课程

相似问题