《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轮回此下一切子元素
    }
}
    原文作者:fishenal
    原文地址: https://segmentfault.com/a/1190000000487317
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞