《JavaScript語言精粹》 代碼摘錄

最近在讀這本評價頗高的《JavaScript語言精粹》,其做者Douglas Crockford 是JSON的創造者,在業界很有名氣。如下是閱讀過程當中認爲比較有用的摘錄的代碼,但願能對各位有所啓發javascript

自定義的method方法

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 的閉包
);

'&lt;&quot;&gt;'.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

//利用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循環此下全部子元素
    }
}
相關文章
相關標籤/搜索