享元类ShareClass
今天打开自己以前编写过的一些Javascript代码,看到了一段关于享元类的代码,觉得思路不错,就黏上来分享一下,体现一个本人的淫格,:)
“享元类”这个概念和思维我也是从《Javascript设计模式》这本书里得知的,实现方法虽然很简单,可是它所体现出来的思维是不错的:通过将一个类的方法传递给另外的一个类,而且可以有选择的来传递。这个思路或许也不新鲜了,可是从这里扩展开来,就给予了我们一种非常好的思维方式了,比如目前流行的“模块编写方式”,模块于模块之间的方法共通以及集合数组方式添加方法到类里面都是可行的,不用通过prototpe的方式来写每一个方法属性。享元类的思路就是将通用的方法组合起来到一个类里面,之后哪一个对象或者类想要这些方法了,就可以扩展到那里了。同时这也是减少代码编写量的一种不错的方式吧。
我参考了书中的享元类的设计方式,扩展到第二个参数可以是对象,也可以是类,具体请看下面的代码:
//将指定的类或者对象全部的方法添加到第一个参数的类里面。
var ShareClass = function(classObj){ //享元类
var a = arguments;
//如果存在第二个参数,则将第二个参数内指定的obj或者class类内的属性和方法传递给第一个参数内的类
//注意:第一个参数需要为类,当然,可以做判断,再分支写代码,这些都是类似来实现的,就不多写了
if (a[1]) {
//第二个参数为对象或者类都可以
var refObj = a[1].prototype === undefined ? a[1] : a[1].prototype;
for (var o in refObj) {
//如果classObj类里已经存在了该方法,将会被覆盖
classObj.prototype[o] = refObj[o];
/*
* 做判断,如果classObj类里已经存在了该方法,则跳过,这样将不会被覆盖
* if(classObj.prototype[o]){
* continue;
* }
* classObj.prototype[o] = a[1][o];
*/
}
}
return classObj;
};
上面的ShareClass类基本说明了我上面所要表达的意思,但是上面的ShareClass还缺少一个功能:就是有选择的传递方法属性。这个也是比较关键的,提供了更多的选择。请接着看下面的代码:
//可以将指定的方法从一个对象或者类传递给另外一个类。
var ShareClass = function(classObj){ //享元类
var a = arguments;
//如果参数只有两个,则将第二个参数的类或者对象的全部的方法传递给第一个参数的类
if (!argument[2]) {
for (var i = 1, n = a.length; i < n; i++) {
var refObj = a[1].prototype === undefined ? a[1] : a[1].prototype;
for (var o in a[i]) {
obj[o] = a[i][o];
}
}
} else { //如果存在第三个参数,则表示从类或者对象中指定的方法添加到另一个类里面
var refObj = a[1].prototype === undefined ? a[1] : a[1].prototype;
for (var i = 2, l = a.length; i < l; i++) {
if(refObj[a[i]]){
classObj.prototype[a[i]]=refObj[a[i]];
}else{
throw new Error("There is no this method in the class or object");
}
}
}
return classObj;
};
经过改进后的ShareClass就可以有选择的来传递方法属性了,:)