搜索 mocha
你看一下console.log(this.el);的结果。如果是null,说明你在获取this.el这个dom对象时出现错误,看是否是拼写出现问题
不仅仅是关闭按钮会相应 click 事件,sidebar的子元素 ul也会响应 ,老师这样写是因为他在后面给ul元素标签终止click事件冒泡。建议你去看一下JS事件冒泡机制~
报错 你不能读取未定义的target属性
你没发现event.target不在function(event)函数里吗
试一下把下面这段放入
function(event){
if( event.target !==this.el){ //此句报错
self.triggerSwitch();
}
}
我也初学 不对勿喷
问题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();//重新去创建
}
content.log("打开或关闭");
实例化。
闭包或者dom加载问题
这里涉及 function 中 this 的相关知识,在函数被“调用”的时候,this 指的是调用对象,而这里的调用对象是 “this.el”,也就是页面的侧边栏对象,由于没有定义 triggerSwitch 方法,所以报错。 Siderbar 构造函数中的 this,如果是在以“构造函数”方式使用(也就是 new Sidebar())时,指的是将要被创建的对象实例,所以 this.el 指的是 sidebar 对象的属性。但是,如果是以“Sidebar()”方式使用上面定义的构造函数,由于没有明确的调用该函数的对象,在浏览器环境下会将 window 对象作为 this,这也就是前面说的构造函数命名上首字母大写,以便提醒使用者采用“new Sidebar()”的方式。 详细内容建议参考《JavaScript 高级程序设计》或《JavaScript 权威指南》的相关章节。