Basic - 基礎代碼
在開始所有的Prototype學習之旅之前,我們首先對Prototype中最常用的一些公用函數做一些研究,這些JavaScript函數將貫穿整個Prototype框架,熟練使用它們不僅有助于我們學習Prototype框架,同時也為我們自己編寫JavaScript應用提供了獨特的思路。
Source View - 源碼解析
var Prototype = {
Version: '1.5.0_rc1',
ScriptFragment: '(?:
)((\n|\r|.)*?)(?:<\/script>)',
emptyFunction: function() {},
K: function(x) {return x}
}
function $() {
var results = [], element;
for (var i = 0; i < arguments.length; i++) {
element = arguments[i];
if (typeof element == 'string')
element = document.getElementById(element);
results.push(Element.extend(element));
}
return results.reduce();
}
var Abstract = new Object();
var Try = {
these: function() {
var returnValue;
for (var i = 0; i < arguments.length; i++) {
var lambda = arguments[i];
try {
returnValue = lambda();
break;
} catch (e) {}
}
return returnValue;
}
}
var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
initialize: function(callback, frequency) {
this.callback = callback;
this.frequency = frequency;
this.currentlyExecuting = false;
this.registerCallback();
},
registerCallback: function() {
this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
},
stop: function() {
if (!this.timer) return;
clearInterval(this.timer);
this.timer = null;
},
onTimerEvent: function() {
if (!this.currentlyExecuting) {
try {
this.currentlyExecuting = true;
this.callback(this);
} finally {
this.currentlyExecuting = false;
}
}
}
}
Field & Function Reference - 屬性方法一覽
Prototype ( 靜態 )
Method / Property |
Kind |
Arguments |
Description |
Version |
靜態屬性 |
/ |
表示Prototype框架的版本號 |
ScriptFragment |
靜態屬性 |
/ |
表示script代碼段的正則表達式 |
emptyFunction |
靜態方法 |
/ |
返回一個什么都不做的空函數 |
K |
靜態方法 |
任意對象 |
返回傳入的參數 |
$() ( 靜態 )
Method / Property |
Kind |
Arguments |
Description |
$() |
靜態方法 |
string或者任意對象, 參數數量不限 |
根據參數的類型和數量返回DOM操作的結果, 傳入的參數為string時,返回document.getElementById所讀取的對象; 傳入的參數為非string類型的對象時, 直接返回參數本身; 當參數個數是1個時, 直接返回上述操作所得的結果; 當參數個數大于1個時, 將每個參數操作的結果組成一個對象數組返回 |
Abstract ( 靜態 )
Method / Property |
Kind |
Arguments |
Description |
Abstract |
類 |
/ |
一個全局的對象, 可以理解為一個命名空間, 成為一個抽象基類 |
Try ( 靜態 )
Method / Property |
Kind |
Arguments |
Description |
these |
靜態方法 |
多個有待依次執行的函數 |
返回第一個成功執行的函數的執行結果 |
PeriodicalExecuter ( 實例 )
Method / Property |
Kind |
Arguments |
Description |
callback |
屬性 |
/ |
構造函數實例化時初始化的屬性, 定義定時器重復執行時真正需要調用的函數 |
frequency |
屬性(Number) |
/ |
構造函數實例化時初始化的屬性, 定義定時器重復執行的時間間隔 |
currentlyExecuting |
屬性(Boolean) |
/ |
在整個定時器執行過程中表示是否當前執行的標志, 可以作為執行過程中的同步信號量 |
timer |
屬性 |
/ |
一個內部變量, 在registerCallback方法調用window.setInterval時記錄該函數的返回值, 用以給stop方法使用 |
registerCallback |
方法 |
/ |
在構造函數初始化完成時調用執行, 也可以直接調用該函數啟動定時器, 在函數內部通過調用window.setInterval方法完成定時器功能 |
stop |
方法 |
this.timer, 即重復執行時調用setInterval的返回值 |
用于暫停定時器, 通過實例變量調用完成 |
onTimerEvent |
方法 |
/ |
一個內部方法, 真正調用callback完成函數執行 |
Analysis & Usage - 分析與使用
Extension - 擴展
$()為我們提供了一個快捷的方式,通過id來讀取一個對象,從而避免了我們在編寫JavaScript代碼時的重復而又冗長的代碼段。然而,在某些情況下,我們需要通過對象的name屬性來讀取對象,并對對象進行一定的操作,此時,$()方法就顯得有些力不從心了。因而在這里,我針對這種需求,并模仿$()方法,實現了一個通過name來讀取對象的函數。
事實上,getElementsByName()已經幫我們解決了大多數的問題。由于name在HTML的document中可以不唯一,因而我們需要對此進行簡單的處理,當name唯一時,直接返回單一對象;當name不唯一時,返回一個數組(這已經與getElementsByName()本身的含義不同了,當然這僅僅是為了方便編程而已)。
------君臨天下,舍我其誰
------