Prototype prov " /> 日韩a电影,一区二区三区91,激情视频一区

四虎精品视频-四虎精品成人免费网站-四虎黄色网-四虎国产视频-国产免费91-国产蜜臀97一区二区三区

Prototype ObjectRange對象學習

Ranges represent an interval of values. The value type just needs to be “compatible,” that is, to implement a succ method letting us step from one value to the next (its successor).

Prototype provides such a method for Number and String, but you are of course welcome to implement useful semantics in your own objects, in order to enable ranges based on them.

ObjectRange對象基本就是實現了連續的數字或者字符串,其中只包含一個方法,include,判斷某個數字或者字符串是否在ObjectRange里。并且ObjectRange對象還混入了Enumerable的方法,所以可以直接在ObjectRange對象上調用Enumerable對象里面的方法。
復制代碼 代碼如下:
//創建ObjectRange的便捷方法
function $R(start, end, exclusive) {
return new ObjectRange(start, end, exclusive);
}

//創建ObjectRange對象并且繼承自Enumerable
var ObjectRange = Class.create(Enumerable, (function() {
    //初始化方法,exclusive為true時,不包含end數值,默認為undefined也就相當于false
function initialize(start, end, exclusive) {
this.start = start;
this.end = end;
this.exclusive = exclusive;
}

//覆蓋Enumerable里面的_each方法,在遍歷ObjectRange對象時需要用到此方法
function _each(iterator) {
var value = this.start;
while (this.include(value)) {
iterator(value);
value = value.succ();
}
}

//判斷某個數值或者字符串是否包含在ObjectRange對象里
function include(value) {
if (value < this.start)
return false;
if (this.exclusive)
return value < this.end;
return value <= this.end;
}

return {
initialize: initialize,
_each: _each,
include: include
};
})());

看一下示例,然后在詳細解釋一些細節:
復制代碼 代碼如下:
$A($R('a', 'e'))
// -> ['a', 'b', 'c', 'd', 'e'], no surprise there

//千萬不要嘗試輸出下面返回的結果,否者將會造成瀏覽器直接死掉
$A($R('ax', 'ba'))
// -> Ouch! Humongous array, starting as ['ax', 'ay', 'az', 'a{', 'a|', 'a}', 'a~'...]

這里說一下$A($R('a', 'e')),如何返回值。首先看$A方法,前面的文章【Prototype 學習――工具函數學習($A方法)】中已經詳細講解了$A方法,不知道請自行參考。在$A方法里面有這樣一句:if ('toArray' in Object(iterable)) return iterable.toArray();我們知道,ObjectRange里面混入了Enumerable里面的方法,也就是說間接實現了toArray方法,那么看一下Enumerable里面的toArray方法:
復制代碼 代碼如下:
function toArray() {
return this.map();
}

//======> this.map()

//我們注意到在返回的時候map方法被映射到了collect方法
return {
//...
collect: collect,
map: collect,
//...
}

//======> collect()

//在本例中這個方法其實就相當于返回一個數組,因為傳進來的參數都是undefined。這里面有一個this.each方法,繼續查看
function collect(iterator, context) {
iterator = iterator || Prototype.K;
var results = [];
this.each(function(value, index) {
results.push(iterator.call(context, value, index));
});
return results;
}

//======> this.each()

//終于看到this._each了,現在明白為什么ObjectRange里面會重寫了_each方法了吧。在遍歷的時候要用到這個方法
function each(iterator, context) {
var index = 0;
try {
this._each(function(value) {
iterator.call(context, value, index++);
});
} catch (e) {
if (e != $break) throw e;
}
return this;
}

//======> this._each()

//詳細說明一下this._each()
//關鍵就是succ()這個方法,因為_each里面使用這個方法產生下一個數值。
//這個succ()在哪里呢?在Number.prototype和String.prototype里面定義了這個方法
function _each(iterator) {
var value = this.start;
while (this.include(value)) {
iterator(value);
value = value.succ();
}
}

//下面兩個方法我就不講了吧。

//======> String.prototype.succ()

function succ() {
return this.slice(0, this.length - 1) +
String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
}

//======> Number.prototype.succ()

function succ() {
return this + 1;
}

//綜上所述,如果你自己想定義其它類型的ObjectRange對象,譬如Date類型,那么你就要自己實現succ()方法,用來生成連續的對象

上面的流程將清楚了,但一些函數沒有仔細講,等講到這些對象的時候在仔細說明里面的函數。下面看幾個include的示例吧:
復制代碼 代碼如下:
$R(1, 10).include(5)
// -> true
$R('a', 'h').include('x')
// -> false
$R(1, 10).include(10)
// -> true
$R(1, 10, true).include(10)
// -> false

JavaScript技術Prototype ObjectRange對象學習,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 语文选择性必修中册电子课本| 正宗辅星水法九星断语| 大奉打更人电视剧在线| 职业目标评估| 老外毛片| 伊人春色在线观看视频| 胡金铨最好的十部电影| 最危险的游戏| 爱情最美丽 电视剧| 23号牛乃唐第二季免费观看| 女生被打屁股的视频| 写现代诗| 甜蜜监狱| 电视剧瞧这一家子演员表| 潇湘影院| 抖音网页版登录官网| 奶酪鼠的穷途梦2| 老板5| 拾贝的小女孩阅读理解答案 | 《牵牛花》阅读答案| 溜溜的她| 阳巧玥| 梦想建筑师泰国百合剧| 员工离职协议书| 电影百度百科| 免费播放高清完整版电影| 第一财经直播电视直播今日股市| 蛇花| 公司辞退员工的合法流程及赔偿| 黑帮大佬和我的三百六十五日| 试看60秒做受小视频| 色戒在线观看视频| 约翰尼·西蒙斯| 乔治娅·格洛梅| jeanette| 陈稳| 哈尔移动的城堡 在线观看| 里番在线看| 即日启程 电影| 出轨的女人电影| 阴道|