JavaScript學習筆記 四十五 策略

2021-06-18 03:28:09 字數 2341 閱讀 2207

策略模式能夠讓你在執行時選擇演算法。你的**使用者可以處理相同的介面但可以從一些可用的演算法中挑選演算法去處理他們具體的任務,依賴於他們打算做什麼的環境。

乙個使用策略模式的示例將是處理表單驗證。你可以通過validate()方法建立乙個驗證器(validator)物件,這個方法將會被呼叫,不管表單的具體型別並始終返回相同的結果——乙個沒有驗證的資料的list和任何錯誤資訊。

但依賴於具體的表單和資料去驗證,你的**使用者可能選擇不同型別的檢查。你的驗證器選擇最佳的策略(strategy)去處理任務並委託具體資料的檢查給適當的演算法。

假設你有下面這段資料,可能從頁面的表單中得到的,並且你想驗證是否是合法的:

var data = ;
為了讓驗證器知道在這個具體的例子中哪個是最佳策略,你需要首先要配置驗證器並設定你認為是合法和可接受的規則。

假設你將不要求last name且fist name可以隨意輸入,但你要求age是乙個數字且username只能由字母和數字組成並不能有特殊字元。配置可能看起來像這樣:

validator.config = ;
現在validator物件被配置為了處理你的資料,你呼叫它的validate()方法並列印驗證錯誤到控制台:

validator.validate(data);

if (validator.haserrors())

這可能列印下面的錯誤資訊:

invalid value for *age*, the value can only be a valid number, e.g. 1, 3.14 or 2010

invalid value for *username*, the value can only contain characters and numbers, no special

symbols

現在讓我們看一下如何實現validator方法。檢查用的演算法是預定義介面的物件——它們提供乙個validator()方法和一行被用在錯誤資訊(error message)裡的幫助資訊(help infomation):

// checks for non-empty values

validator.types.isnonempty = ,

instructions: "the value cannot be empty"

};// checks if a value is a number

validator.types.isnumber = ,

instructions: "the value can only be a valid number, e.g. 1, 3.14 or 2010"

};// checks if the value contains only letters and numbers

validator.types.isalphanum = ,

instructions: "the value can only contain characters and numbers, no special symbols"

};

最終核心的validator物件:
var validator = ,

// error messages in the current

// validation session

messages: ,

// current validation config

// name: validation type

config: {},

// the inte***ce method

// `dataìs key => value pairs

validate: function(data)

if (!checker) ;

}result_ok = checker.validate(data[i]);

if (!result_ok) }}

return this.haserrors();

},// helper

haserrors: function()

};

正如你看到的,validator物件是通用的並可以對所有驗證用例這樣保持這樣。改進的辦法可能是增加更多型別的檢查。如果你在一些頁面上使用它,不久你將擁有一批非常好的檢查(check)。然後你所需要做的為每個新用例配置驗證器並執行validate()方法。

JavaScript學習筆記(四)

匿名函式與閉包 匿名函式 所謂匿名函式就是沒有名字的函式,即建立乙個沒有名字的函式物件,可以將這個函式物件賦給乙個var,或者作為引數傳遞,作為函式返回值等等。var fcn function 閉包所謂閉包就是在函式中定義的函式,這個函式一般用來做返回值 即用乙個函式來生產函式 那麼返回的這個內部函...

JavaScript學習要點(四)

function hasprototypeproperty object,name 用來判斷是否是原型中的變數 先前建立的例項,修改原型後,例項能馬上得到原型方法,但重寫整個原型後,例項中的指標指向的卻還仍然是先前的原型 我們可以通過給原生物件的原型新增方法來對原生物件進行拓展 string.pro...

Javascript 學習筆記

如果在生成的html裡面有事件需要傳遞帶特殊字元的引數,處理如下 singletext 輸入 1.singletext value.escapehtml 為 將html編碼 2.singletext value.escapehtml inspect 為 3.在 jsdebugtext innerht...