扩展方法就是给原生类型添加方法,让对象用起来更加方便,JS作为一个动态语言,只要在原型链上稍作修改就可以给现有类添加方法(在js里提类可能不太恰当,但是我想不出别的说法了)
先回忆一下如何给Array添加一个拓展方法
Array.prototype.get=function (index) {
return this[index]
}
这样就给array添加了一个get方法,这个方法没有太多意义,只是用作示范
然后我们就可以对js里的array调用get了
console.log([1,2,3].get(1))//输出2
以上这些相信很多人都已经知道了,但是我以前一直没有找到给纯数字添加拓展方法的办法,例如一些现代语言里就有这种 10.times(lambda)就可以快速调用十次某方法。
js里确实也可以找到数字类型的原型,那就是它对应的包装对象Number,但是加了方法之后直接调用会有问题,因为实际上js里基本类型没有方法,调用时全部是委托给包装类型的,这也可以看出js和其他一些动态语言的区别,例如ruby里就没有基本类型,所有的东西都是对象
//给数字类型添加扩展方法
Number.prototype.times=function (fun) {
for(var i=0;i<this;i++)
{
fun(i)
}
}
//解析失败,不能这么写
10.times(i=>console.log(i))
//显式创建包装对象就可以了
var a=new Number(10)
//控制台输出0-9
a.times(i=>console.log(i))
和数字不一样,string也是基本类型却不会有这个问题,添加扩展方法后,直接"xxx".doSth()就可以
直到今天,在复习js一些问题的时候又回想起这个东西,突然觉得可能仅仅只是js虚拟机内部的逻辑问题,然后试着加了个(),想想是不是这样就可以将基本类型的数字转化成包装类型,然后居然就成了,特此记录一下
//这个可以运行 在控制台输出0-9
(10).times(i=>console.log(i))