菜单

Prototype源码浅析www.2138.com:

2020年2月15日 - www.2138.com

在javascript中,根本找不到Enumerable的黑影,因为这一块是Prototype小编从Ruby中借鉴过来的。并且Enumerable在实质上中一贯未有直接行使的火候,都是混入到任何的对象中,可以说是别的对象的贰个“父类”(然则只是调用了Object的extend方法,进行了措施的直白拷贝而已)。
笔者并素不相识Ruby,可是看Enumerable中的一些艺术,倒是跟Python中的有几分近似。
Enumerable个中多少个最根本的点子是each,each那么些艺术应该都相比领悟,其意义就是遍历四个种类的有所因素,并开展对应的管理。不过多数是选择在数组上,举个例子原生数组的forEach方法,以至jQuery中的链式调用,都依据于each方法。因为jQuery选取器重临的是叁个DOM对象数组,然后再在回去的数组上来调用each,进而分别管理每三个因素。
日常each都有五个参数:三个是迭代管理的函数和方式对应的上下文。 复制代码 代码如下: var each =
Array.prototype.forEach || function{ for(var i = 0,len = this.length ; i
< len ; i++卡塔尔(قطر‎{ iterator.call; } };
根据地点的艺术,我们给Array对象扩张学一年级个打字与印刷当前颇有因素的print方法。
复制代码 代码如下: Array.prototype.each =
Array.prototype.forEach || function{ for(var i = 0,len = this.length ; i
< len ; i++卡塔尔(قطر‎{ iterator.call(context,this[i],i,this卡塔尔; } };
Array.prototype.print = function(State of Qatar{ this.each{ console.log; }
console.log;//1,2,3,4
在Enumerable中,each并未对应到具体的主意,前边说过Enumerable并不之际应用,而是作为一个“父类”应用到其它的对象,由此它的each方法是调用“子类”_each方法,因而任何混入Enumerable模块的靶子,都必须要提供一个_each方法,作为职能于实际循环的迭代代码。
今后Array.prototype上得以落成三个_each方法和叁个each方法,完成一: 复制代码 代码如下: Array.prototype.each =
function{ this._each } Array.prototype._www.2138.com,each = function{ for(var i =
0,len = this.length ; i < len ; i++){
iterator.call(context,this[i],i,this卡塔尔(قطر‎; } };
根据之前说的,_each只须求提供多个iterator参数就足以了,但是由于_each也被扩张到Array.prototype下面,于是实现的时候也顺带了context参数。因而在Enumerable中,并从未采用_each的首个context参数,是还是不是落实对each未有影响。由此地方的兑现一
不应有依据_each的context,于是修正each如下: 复制代码 代码如下: Array.prototype.each =
function{ var index = 0; this._each{
iterator.call(context,value,index++State of Qatar; }卡塔尔 }
这样一来,each方法的独立性提升了,在继续的Hash中也得以使用这一个Enumerable了。任何看遍历的靶子,只要提供了_each方法,即可从Enumerable这里收获对应的秘籍。
由此,将方面包车型大巴print例子用Enumerable的花样来得以完结,便获得如下的结果:
复制代码 代码如下: var Enumerable = {};
Enumerable.each = function { var index = 0; this._each{
iterator.call(context, value, index++); }); return this; };
Enumerable.print = function(){ this.each{ console.log };
Array.prototype._each = function{ for(var i = 0,len = this.length ; i
< len ; i++){ iterator.call(context,this[i],i,this卡塔尔(قطر‎; } };
//下边包车型客车达成源码中是用的extend方法 for(var key in Enumerable卡塔尔{
Array.prototype[key] = Enumerable[key]; };
[1,2,3,4].print(卡塔尔;//1,2,3,4
驾驭each的兑现是清楚Enumerable对象的机要,前边的Array和Hash都混入Enumerable对象,颇为首要。
转发请表明来源小西山子【

相关文章

发表评论

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

网站地图xml地图