最近在读这本评价颇高的《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循环此下所有子元素
}
}