享元类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就可以有选择的来传递方法属性了,:)

几种构造函数的性能比较

在Javascript的OOP编程过程中,构造函数的声明方式和编写都是必须的,下面是我所能想到的五种构造函数的声明方式,现在就让我们来测试一下它们实例化的性能比较有什么差别(当然了,下面的只是一些简单的构造函数,对于庞大的构造函数的话,性能的差异也就更加明显了)。

第一种方式:就是我们普通都会使用的方式了,在构造函数内声明属性,在函数为通过prototype声明方法

var Class3 = function(){
    this.website = "http://www.ilovejs.net";
}
Class3.prototype = {
    showSite: function(){
        alert(this.website);
    }
}

第二种方式:是将方法和函数都声明在构造函数内,这种方式目前不太提倡使用,因为每次构造函数实例化的时候都会生成一个不同的showSite方法

var Class1 = function(){
    this.website = "http://www.ilvoejs.net";
    this.showSite = function(){
        alert(this.website);
    }
}

第三种方式:构造函数为空的声明方式,将属性和方法都声明在构造函数的外部,经过测试,这种方式的性能是最好的,因为它的构造函数基本没有什么操作,所以实例化的速度是最快的。

var Class2 = function(){
};
Class2.prototype = {
    website: "http://www.ilovejs.net",
    showSite: function(){
        alert(this.website);
    }
}

(全文…)