近来在读这本评价颇高的《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 的闭包
);
'<">'.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轮回此下一切子元素
}
}