我知道的JavaScript
1. JavaScript闭包
代码:
view plain
<pre name="code" class="javascript">(function(){
var validator_elements_blur_selector = ‘…’;
var validator_elements_change_selector = ‘…’;
var validator_elements_selector = ‘…’;
//some other codes…
})();
解释:以上代码中的三个变量的作用域就在整个( )之间,外部无法改变这三个变量的值。这样就可以防止第三方代码对自己本身逻辑的侵入。这也是现在很多Js框架常用的自我保护的方法。代码最后的( )是对这个function 执行操作。前面的( )是对function 进行对象化的包装。这样这段逻辑就可以在代码所在的上下文立即执行了。
2. Javascript 数据结构之– Hashtable
代码:
view plain
<pre name="code" class="javascript">function Hashtable() {
this._hashValue= new Object();
this._iCount= 0;
}
Hashtable.prototype.add = function(strKey, value) {
if(typeof (strKey) == "string"){
this._hashValue[strKey]= typeof (value) != "undefined"? value : null;
this._iCount++;
returntrue;
}
else
throw"hash key not allow null!";
}
Hashtable.prototype.get = function (key) {
if (typeof (key)== "string" && this._hashValue[key] != typeof('undefined')) {
returnthis._hashValue[key];
}
if(typeof (key) == "number")
returnthis._getCellByIndex(key);
else
throw"hash value not allow null!";
returnnull;
}
Hashtable.prototype.contain = function(key) {
returnthis.get(key) != null;
}
Hashtable.prototype.findKey = function(iIndex) {
if(typeof (iIndex) == "number")
returnthis._getCellByIndex(iIndex, false);
else
throw"find key parameter must be a number!";
}
Hashtable.prototype.count = function () {
returnthis._iCount;
}
Hashtable.prototype._getCellByIndex = function(iIndex, bIsGetValue) {
vari = 0;
if(bIsGetValue == null) bIsGetValue = true;
for(var key in this._hashValue) {
if(i == iIndex) {
returnbIsGetValue ? this._hashValue[key] : key;
}
i++;
}
returnnull;
}
Hashtable.prototype.remove = function(key) {
for(var strKey in this._hashValue) {
if(key == strKey) {
deletethis._hashValue[key];
this._iCount--;
}
}
}
Hashtable.prototype.clear = function () {
for (var key in this._hashValue) {
delete this._hashValue[key];
}
this._iCount = 0;
}
解释:Hashtable在c#中是最常用的数据结构之一,但在JavaScript 里没有各种数据结构对象。但是我们可以利用动态语言的一些特性来实现一些常用的数据结构和操作,这样可以使一些复杂的代码逻辑更清晰,也更符合面象对象编程所提倡的封装原则。这里其实就是利用JavaScriptObject 对象可以动态添加属性的特性来实现Hashtable, 这里有需要说明的是JavaScript 可以通过for语句来遍历Object中的所有属性。但是这个方法一般情况下应当尽量避免使用,除非你真的知道你的对象中放了些什么。
[By the way]: StringCollection/ArrayList/Stack/Queue等等都可以借鉴这个思路来对JavaScript 进行扩展。
3. JavaScript设计模式(桥接)应用之 – Validation
引子:
首先请各位同学跟我来一起复习设计模式中的桥接模式(Bridge), 废话不多言表直接上图:
在这个设计模式中我们的抽象类和实现类可以各自进行扩展和封装这样就可以对它们进行脱耦, 通过组合来产生很多变化。这种思想也符合“少用继承,多用组合”的设计原则.在桥接模式中我们可以用Abstraction 类来对实现类(ConreteImplementor)和修正抽象化类(RefinedAbstraction)进行桥接。但JavaScript 如何实现桥接呢?Please follow me
代码:
Validation类:
view plain
Validation= {
required: function(elem) {
return!$(elem).val().trim().isNullOrEmpty();
},
email: function(elem) {
returnValidation.regexValidator($(elem).val().trim(),Validation.Regex.email);
},
regexValidator: function(elemVal, /*string*/regex,) {
if(!elemVal.isNullOrEmpty() && !(elemVal.match(regex, "\g"))) {
returnfalse;
} else{
returntrue;
};
},
Regex: {
email:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)?$/
}
};
Validation.validateColl= {
'jq-validation-required': {validFunc:Validation.required, ErrMsg: 'Required'},
'jq-validation-email': {validFunc:Validation.email, ErrMsg: 'Invalid email address'}
};
Validator类:
view plain
(function () {
varvalidator_elements_blur_selector = 'input[type="text"]';
varvalidator_elements_change_selector = 'select,input[type="hidden"]';
var validator_elements_selector =validator_elements_blur_selector + ',' +validator_elements_change_selector;
Validator = function(validateScopeSelector) {
this._validateColl= $.extend(true, {}, Validation._validateColl);
this._validateDom= $(validateScopeSelector);
补充:web前端 , JavaScript ,