山大芋折腾志

The world is a … 〇

闲得蛋疼之属性观察者

javascript以前是没有getter和setter的,就是说我没办法在一个变量值被改变的时候,去做一些事情。

一开始觉得,非对象类的值没办法作为引用传给函数,就是没有 function(&str){…} 这样的写法,死穴啊。后来一下开窍,js有js的路数嘛,只能传对象引用就传变量所处对象的引用好了,变量名当成字符串传,放一块儿就能找到对应的变量引用了。

比如:var s; watch(s); 这样行不通(s被当做值传递了),那我可以这样:var s;watch(window,’s'),window是引用,通过window['s']就能拿到s的引用了。

这样一来以上问题就有办法咯,上菜:

  1. Object.prototype.watch = function(k,func){
  2.  var env = this,t = env[k];
  3.  
  4.  setInterval(function(){
  5.   if(env[k] !== t){
  6.    func.call(this,t,env[k]);
  7.    t=env[k]);
  8.   }
  9.  },100);
  10. }

说白了其实就是设一个timer不断去检测一个变量看他有没有变,没什么技术含量。用起来就像这样:

  1. var s;
  2. window.watch('s',function(oldv,newv){
  3.  console.log('varible s has changed from '+ oldv + ' to ' + newv);
  4. });
  5. s=3;//varible s has changed from undefined to 3
  6.  
  7. //还可以这样用:
  8. var input = document.getElementById('username');
  9. input.watch('value',function(oldv,newv){
  10.  console.log('input value has changed from '+ oldv + ' to ' + newv);
  11. });

这样就很happy啦。其实新的javascript 标准里已经包含类似的接口了,我们可以这样写:

  1. window.__defineGetter__('s',function(){console.log('getting s')});
  2. window.__defineSetter__('s',function(v){console.log('varible s is set to '+v )});
  3. window.s;//getting s
  4. window.s=3;//varible s is set to 3

更多介绍可以看John Resig的文章

还有些细节我也还没太明白,看起来defineGetter这样一句里面就已经做了声明s的事情,额外写一句var s反而会适得其反,没有效果= =

最后留个困扰我很久的问题,类似事件啊,消息啊,getter/setter这种东西,其内在的原理是什么?我想了半天还是觉得最终其实都应该是靠不断循环判断吧。就像comet跟传统的ajax轮询的区别其实也就在于把一个不断向服务器发送请求的循环变成服务器自己在那里轮询文件修改日期或者数据库,再返回结果。也就是说把循环放到执行效率更高的地方去而已,不知道我的理解是否正确……

随便推荐几张碟

现在听歌都是在豆瓣电台瞎听,越来越match我的口味的同时还不断的带来惊喜,听到喜欢的就标个星,最近悦耳的几张都比较杂,随便拎两张出来分享一个。


法国电子乐


日本,吉他指弹


冥想音乐


日式小清新


电影原声,南斯拉夫风格


吉他,曼陀林

就先这么点儿吧。7月份有不少想去看的演出,除了旅行团的巡回之外最想看的就是这个了,来自蒙古的阿基耐乐队,暖场是上海人民最喜欢的顶马,非去不可!

js事件绑定执行顺序

今天干活的时候碰到了很诡异的事情。
一个属性莫名在我认为所有操作都应该完成了之后被设成了错误的值。
找了半天发现是在一个没注意的地方多绑定了一次事件。
一开始以为和ie下的ajax是否异步有关系,其实就是事件绑定执行顺序的事儿。

很简单一段代码:

  1. elem.addEvent('click',function(){alert('first')});
  2. elem.addEvent('click',function(){alert('second')});

在ie6,7,8下都是后绑定的函数先执行,其他浏览器则是先绑定先执行。
啊!太傻逼了!

言归正传,我认为这一层应该由类库去避免掉。
就是同一个elem,同一个事件类型,永远只允许绑定一个事件。
有多个事件绑定上来的时候就往自己管理的一个堆栈里压。
这样触发的时候,就不是直接执行响应绑定函数,而是去这个堆栈里挨个执行响应函数。
道理上就可以避免这种状况了,当然参数什么的还要重新绑一下。

话说这种底层的东西好没热情自己去实现一下啊,就这么着吧= =。
既然ie9已经没有这个问题了,证明m$自己也觉得以前那样很傻逼吧,不管了不管了,统统给我升级浏览器去。

昆明青旅室友言论

革命是怎么回事?激化矛盾,分裂正营,选择敌对阵营,分化瓦解对方以巩固自己。一般都是分封制,画大饼,跟传销差不多,因为没有实际的东西可以给别人。

这只是一小部分,你学会了你就会发现社会学太可怕了,当初毛看了社会学就觉得这是个好东西啊,不过此等武林秘籍只能老子一个人学。所以中国没有社会学,他不会禁掉你,他会把你往歪路子上去引,说社会学是科学,社会学哪儿是科学啊。 Read the rest of this entry »

从重庆到泸沽湖

重庆磁器口

朋友去泸沽湖达祖小学做志愿者,帮忙整理了一下图书馆资料,之后就一直教唆我过去也出把力,他们也刚好在招网站建设志愿者之类的,刚好自己本来就有想去云南玩的打算,刚好找到了一个好借口。

由于自己出牌没什么计划性,加上对毕业环节的时间安排很没谱,所以直到临走前一个礼拜才买的机票,花掉了很多不必要的钱,大家引以为戒。这是一篇流水账,有想去的朋友可以小作参考。 Read the rest of this entry »