《JavaScript语言精粹》 代码摘录


最近在读这本评价颇高的《JavaScript语言精粹》,其作者Douglas Crockford 是JSON的创造者,在业界颇有名气。以下是阅读过程中认为比较有用的摘录的代码,希望能对各位有所启发

自定义的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())

模块-闭包模拟

道格拉斯用闭包来实现模块- 提供接口却隐藏状态与实现的函数/对象

//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次

//记忆
//不好的例子
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循环此下所有子元素
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>