添加JavaScript重載函數(shù)的輔助方法2
更新時(shí)間:2010年07月04日 19:39:54 作者:
話說(shuō),人就是要被關(guān)注才有動(dòng)力啊于是修改了下上次寫(xiě)的《添加JavaScript重載函數(shù)的輔助方法》在添加方法的時(shí)候增加了一個(gè)參數(shù) 用于限制參數(shù)的類型。
代碼依然簡(jiǎn)單。所以依然沒(méi)什么好解釋的。。
/** KOverLoad
一個(gè)創(chuàng)建重載函數(shù)的輔助方法。
補(bǔ)充上次的函數(shù)。
@Author ake 2010-07-03
@weblog http://www.cnblogs.com/akecn
*/
var KOverLoad = function(scope) {
this.scope = scope || window; //默認(rèn)添加方法到這個(gè)對(duì)象中。同時(shí)添加的方法的this指向該對(duì)象。
this.list = {}; //存放重載函數(shù)的地方。
return this;
};
KOverLoad.prototype = {
//添加一個(gè)重載的方法。
//@param arg<Function> 重載的方法。
add:function(arg, types) {
if(typeof arg == "function") {
var types = (types || []).join(",");
this.list[arg.length + types] = arg; //以參數(shù)數(shù)量和類型做標(biāo)識(shí)存儲(chǔ)重載方法。很顯然如果你的重載方法參數(shù)數(shù)量
return this;
}
},
checkTypes: function(types) {
var type = [];
//console.log(typeof type); []方式創(chuàng)建的數(shù)組,其typeof類型為object
//如果需要判斷類型的話 還是用Object.prototype.toString.call(type) == "[object Array]"來(lái)判斷吧。
for(var i=0, it; it = types[i++];) {
type.push(typeof it);
}
return type.join(",");
},
//添加完所有的重載函數(shù)以后,調(diào)用該方法來(lái)創(chuàng)建重載函數(shù)。
//@param fc<String> 重載函數(shù)的方法名。
load:function(fc) {
var self = this, args, len, types;
this.scope[fc] = function() { //將指定作用域的指定方法 設(shè)為重載函數(shù)。
args = Array.prototype.slice.call(arguments); //將參數(shù)轉(zhuǎn)換為數(shù)組。
len = args.length;
types = self.checkTypes(args);
//console.log(self.list);
if(self.list[len + types]) { //根據(jù)參數(shù)數(shù)量調(diào)用符合的重載方法。
self.list[len + types].apply(self.scope, args); //這里指定了作用域和參數(shù)。
}else if(self.list[len]){
self.list[len].apply(self.scope, args)
}else {
throw new Error("undefined overload type");
}
}
}
};
下面是示例:
var s = {};
new KOverLoad(s) //設(shè)置方法綁定的位置。命名空間?
.add(function(a) {
console.log("one",a,this)
},["string"])
.add(function(a,b) {
console.log("two",a,b,this)
},["string","string"])
.add(function(a,b,c) {
console.log("three",a,b,c,this)
},["string", "number", "string"])
.add(function(a,b,c,d) {
console.log("four",a,b,c,d,this)
})
.load("func"); //在這里的參數(shù)就是要?jiǎng)?chuàng)建的重載函數(shù)的方法名稱。
s.func("a","b");
復(fù)制代碼 代碼如下:
/** KOverLoad
一個(gè)創(chuàng)建重載函數(shù)的輔助方法。
補(bǔ)充上次的函數(shù)。
@Author ake 2010-07-03
@weblog http://www.cnblogs.com/akecn
*/
var KOverLoad = function(scope) {
this.scope = scope || window; //默認(rèn)添加方法到這個(gè)對(duì)象中。同時(shí)添加的方法的this指向該對(duì)象。
this.list = {}; //存放重載函數(shù)的地方。
return this;
};
KOverLoad.prototype = {
//添加一個(gè)重載的方法。
//@param arg<Function> 重載的方法。
add:function(arg, types) {
if(typeof arg == "function") {
var types = (types || []).join(",");
this.list[arg.length + types] = arg; //以參數(shù)數(shù)量和類型做標(biāo)識(shí)存儲(chǔ)重載方法。很顯然如果你的重載方法參數(shù)數(shù)量
return this;
}
},
checkTypes: function(types) {
var type = [];
//console.log(typeof type); []方式創(chuàng)建的數(shù)組,其typeof類型為object
//如果需要判斷類型的話 還是用Object.prototype.toString.call(type) == "[object Array]"來(lái)判斷吧。
for(var i=0, it; it = types[i++];) {
type.push(typeof it);
}
return type.join(",");
},
//添加完所有的重載函數(shù)以后,調(diào)用該方法來(lái)創(chuàng)建重載函數(shù)。
//@param fc<String> 重載函數(shù)的方法名。
load:function(fc) {
var self = this, args, len, types;
this.scope[fc] = function() { //將指定作用域的指定方法 設(shè)為重載函數(shù)。
args = Array.prototype.slice.call(arguments); //將參數(shù)轉(zhuǎn)換為數(shù)組。
len = args.length;
types = self.checkTypes(args);
//console.log(self.list);
if(self.list[len + types]) { //根據(jù)參數(shù)數(shù)量調(diào)用符合的重載方法。
self.list[len + types].apply(self.scope, args); //這里指定了作用域和參數(shù)。
}else if(self.list[len]){
self.list[len].apply(self.scope, args)
}else {
throw new Error("undefined overload type");
}
}
}
};
下面是示例:
復(fù)制代碼 代碼如下:
var s = {};
new KOverLoad(s) //設(shè)置方法綁定的位置。命名空間?
.add(function(a) {
console.log("one",a,this)
},["string"])
.add(function(a,b) {
console.log("two",a,b,this)
},["string","string"])
.add(function(a,b,c) {
console.log("three",a,b,c,this)
},["string", "number", "string"])
.add(function(a,b,c,d) {
console.log("four",a,b,c,d,this)
})
.load("func"); //在這里的參數(shù)就是要?jiǎng)?chuàng)建的重載函數(shù)的方法名稱。
s.func("a","b");
您可能感興趣的文章:
- 如何實(shí)現(xiàn)JS函數(shù)的重載
- js 覆蓋和重載 函數(shù)
- js中方法重載如何實(shí)現(xiàn)?以及函數(shù)的參數(shù)問(wèn)題
- JS函數(shù)重載的解決方案
- 有關(guān)于JS構(gòu)造函數(shù)的重載和工廠方法
- Javascript基礎(chǔ) 函數(shù)“重載” 詳細(xì)介紹
- 詳解JS函數(shù)重載
- 為JavaScript添加重載函數(shù)的輔助方法
- JavaScript中的函數(shù)重載深入理解
- javascript函數(shù)重載解決方案分享
- 通過(guò)實(shí)例理解javascript中沒(méi)有函數(shù)重載的概念
- JavaScript函數(shù)重載操作實(shí)例淺析
相關(guān)文章
使用JavaScript實(shí)現(xiàn)圖片的自動(dòng)輪播
在網(wǎng)站開(kāi)發(fā)中,經(jīng)常會(huì)遇到需要展示多張圖片并自動(dòng)切換的需求,這就需要使用JavaScript來(lái)實(shí)現(xiàn)圖片的自動(dòng)輪播功能,本文將通過(guò)一個(gè)簡(jiǎn)單的例子,演示如何用JavaScript實(shí)現(xiàn)圖片的自動(dòng)輪播,感興趣的同學(xué)可以自己動(dòng)手試一試2023-09-09WEB 前端開(kāi)發(fā)中防治重復(fù)提交的實(shí)現(xiàn)方法
這篇文章主要介紹了JS WEB 前端開(kāi)發(fā)中防治重復(fù)提交的實(shí)現(xiàn)方法,涉及到表單提交的幾種方式介紹,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10小程序?qū)崿F(xiàn)搜索界面 小程序?qū)崿F(xiàn)推薦搜索列表效果
這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)搜索界面,小程序?qū)崿F(xiàn)推薦搜索列表效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05JavaScript WebAPI、DOM、事件和操作元素實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于JavaScript WebAPI、DOM、事件和操作元素的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-06-06JS動(dòng)態(tài)添加與刪除select中的Option對(duì)象(示例代碼)
本篇文章主要介紹了JS動(dòng)態(tài)添加與刪除select中的Option對(duì)象示例代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12js報(bào)$ is not a function 的問(wèn)題的解決方法
在html中的程序,跑的好好的,換成jsp在項(xiàng)目中跑,就一直報(bào)$ is not a function錯(cuò),針對(duì)此問(wèn)題,下面有個(gè)不錯(cuò)的解決方法,大家可以嘗試操作下2014-01-01微信小程序?qū)W習(xí)總結(jié)(二)樣式、屬性、模板操作分析
這篇文章主要介紹了微信小程序樣式、屬性、模板操作,結(jié)合實(shí)例形式分析了微信小程序尺寸單位、樣式、數(shù)據(jù)初始化、屬性、模板調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2020-06-06