Posted in Javascript onJune 11, 2009
那么分享几个理想状态的js原型函数。大部分整理修改自月影的blog
另外推荐一下月影的书——"王者归来",如果你每周js的coding时间大于5小时,还是值得一读的。
1.函数胶水,有很多同学用jq用习惯了,有时就为一个类似于c#里的event+=delegate而用jq,似乎有点划不来,这几原型函数就够了。
Function.prototype.$concat = function(){ var funcs = [this].concat(Array.apply([], arguments)); return function(){ var ret = []; for(var i = 0; i < funcs.length; i++){ var func = funcs[i] instanceof Function ? funcs[i] : new Function(funcs[i]); ret.push(func.apply(this, arguments)); } return ret; } } //var concat = (function a(a){ // alert("a:"+a); //}).$concat(function b(b){ // alert("b:"+b); //}); //concat(1);
2.函数柯灵化,柯灵化是面向函数式语言的一个重要特性,和大部分人所持有的面向过程的编程思想区别很大,就我愚见,日常工作中,函数柯灵化除了能把一些代码写得优雅(或许还有诡异)以外,不是特别的"必要"。
Function.prototype.$curry=function(){ with({that:this}) return function() { var args = Array.prototype.slice.call(arguments); if(args.length<that.length) { return function(){ var _args = args.concat(Array.prototype.slice.call(arguments)); return that.$curry().apply(this,_args); } } else return that.apply(this,args); } } //var curry=(function f(a,b,c){ // alert([a,b,c]); // }).$curry(); //curry(1)(2)(3); //curry(1,2)(3);
3.对象闭包。这个词是我造的,不过看一下注释里的调用便可以理解,这个函数原本是为了证明with和闭包的等价性,但却提供了一个极有价值的模式。
Function.prototype.$bind=function(object){ var callback = function () { return arguments[0]; } with(object){ return eval('callback(' + this.toString() + ')'); } } //var obj = {a:1,b:2}; //var bind=(function (){ // a=10; // b=11; //}).$bind(obj); //bind(); //alert(obj.a);
4. string.Format。怕是很多js coder都想有一个c#(java类似)里的string.Format方法,其实一点也不麻烦。
String.prototype.$format=function(){ var ret; for(var i=1;i<arguments.length;i++){ var exp = new RegExp('\\{' + (i-1) + '\\}','gm'); ret = (ret||this).replace(exp,arguments[i-1]); } return ret; } //alert("{0},{1},{4}".$format(0,1,2));
以后有机会还会陆续分享一些这样犀利的函数。暂且给些函数合计取个名字,就叫 p.js 吧。
犀利的js 函数集合
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@