楼下说的不要说的太隐晦嘛,大声告诉大家,在function Window(){}中调用widget构造函数
function Window(){widget.Widget.call(this);} ,这样就把handlers属性绑定在构造的对象中,根据原型链的访问顺序,原型上的handlers就相当于被重载了。这样每次单击a的时候(也就是new win的时候)都会重新生成一个handlers!恩 没错 就是这样
function Window(){widget.Widget.call(this);} ,这样就把handlers属性绑定在构造的对象中,根据原型链的访问顺序,原型上的handlers就相当于被重载了。这样每次单击a的时候(也就是new win的时候)都会重新生成一个handlers!恩 没错 就是这样
2017-05-10
按照J高程上说的方法,可以在Window类的构造函数内,调用Widget构造函数,这样“this.handlers = {};”执行下来就会给Window类实例增加一个属性handlers,而且是这个实例独有的,不是共享的。而Widget的pototype里的方法,还是照旧extend到Window的prototype里,每个实例共享这些方法。这样就不会出现handlers内事件翻倍的问题了
2017-04-09
Window从Widget继承来的on方法和fire方法和handlers属性都放在了Window.prototype里,也就是说Window类的实例全部共享on方法、fire方法,和handlers属性。评论里说的清空handlers属性只能解决一部分问题,但是只要页面里有多个,或者有过多个Window类的实例,就会存在handlers内保存的数据有问题的情况。《Javascript高级程序设计》里有讲到这个问题,我看到的比较合理的解决办法叫做“组合继承”,在6.3.3章节。
2017-04-09
最赞回答 / 作死的花生酱
on、fire都是window对象的方法。this指向什么,要根据上下文来判断,this指向的东西并不是不变的。调用on方法的时候,按当时的上下文,this指向的是window对象。可以直接this.on这么调用。到了要使用fire方法的时候,是在click(function(){ …… })里边了,一个作为参数的无名函数里边。在这个函数里,this指向的不是window,所以你没法直接this.fire这样调用。
2017-04-03