最近在讀這本評價頗高的《JavaScript語言精粹》,其做者Douglas Crockford 是JSON的創造者,在業界很有名氣。如下是閱讀過程當中認爲比較有用的摘錄的代碼,但願能對各位有所啓發javascript
Function.prototype.method = function(name,func){//擴展Function對象,爲Function對象,添加method方法,參數1是函數名字,參數2是添加的函數體 if(!this.prototype[name]){ this.prototype[name] = func; } return this; } Number.method('integer',function(){//爲Number對象擴展方法integer return Math[this < 0 ? 'ceil' : 'floor'](this);//number小於0,採用Math.ceil,大於Math.floor,調用方法,傳入的實參this即number自己 }) document.writeln((-10/3).integer())//-3 String.method('trim',function(){//爲String對象擴展trim方法 return this.replace(/^\s+|\s+$/g,'')//正則前起空格,後起空格,全局匹配 }) document.writeln(" neat ".trim())
道格拉斯用閉包來實現模塊- 提供接口卻隱藏狀態與實現的函數/對象java
//deentityfy= 尋找字符串的字符實體並轉換爲對應的字符 String.method('deentityify',function(){ //映射表 var entity = { quot : '"', lt : '<', gt : '>' }; return function(){//返回函數攜帶entity return this.replace(/&([^&;]+);/g,function(a,b){ //a爲 匹配到的字符串,b爲匹配組內 var r = entity[b]; return typeof r === 'string' ? r : a; }); }; }()//自執行,做者的目的是返回匿名函數 攜帶entity 的閉包 ); '<">'.deentityify()
fibonacci數列,前一種算法計算了453次,後一種算法調用了29次node
//記憶 //很差的例子 var fibonacci = function(n){ return n<2 : fibonacci(n-1) + fibonacci(n-2); } //好的例子 var fibonacci = function(){ var memo = [0,1]; var fib = function(n){ var result = memo[n]; if(typeof result !== 'number'){ result = fib(n-1) + fib(n-2); memo[n] = result; } return result; } return fib; }(); //執行 for(var i = 0; i <= 10; i += 1){ document.writeln('// '+i+': '+fibonacci(i)); } //執行過的會緩存到fib閉包的memo數組裏
//利用arguments實現不定參數的相加 var sum = function (){ var i,sum = 0; for(i=0;i<arguments.length;i++){ sum+=arguments[i]; } return sum; } sum(4,8,15,16,23,42)
這裏有一些不理解算法
//new 關鍵字的實現 Function.method('new',function(){ //建立新對象,繼承自構造器的原型對象 var that = Object.create(this.prototype) //調用構造器, var other = this.apply(that,arguments) return (typeof other == 'object' && other) || that; }) if(typeof Object.create !== 'function'){//Object.create ESC5 引入,爲不支持的實現object.create Object.create = function(o){ var F = function(){};//建立新函數對象 F.prototype = o;//設置原型 return new F();//經過new 返回新F } } Function.method('inherits',function(Parent){ this.prototype = new Parent(); return this })
//利用遞歸實現dom遍歷的方法 var walk_the_DOM = function walk(node, func){//dom 遍歷 func(node);//調用func,傳入node node = node.firstChild;//更改node爲其第一個子元素,若是沒有意味着終點 while (node) {//若是有子元素,爲子元素執行walk函數自己,其node參數爲以前node的第一個子元素,while循環全部子元素 walk(node, func); node = node.nextSibling;//while循環此下全部子元素 } }