普通的javascript不能在类一级像C#一样定义private static的变量和函数。我们知道在javascript中变量的生命周期是函数,所以同过这个概念,我们通过一定的格式上的包装能够实现定义类级的私有变量和私有函数,这两个成员对类外是不可见的。
此例中我首先定义了一个类似月array的类,此类用来保存回调函数:
callbackList = function () {
this.length = 0;
}
callbackList.prototype.add = function (me) {
var has = false;
for (var i = 0; i < this.length; i++) {
if (this[i] === me) {
has = true;
break;
}
}
if (!has) {
this[this.length] = me;
this.length++;
}
};
callbackList.prototype.remove = function (me) {
var has = false;
for (var i = 0; i < this.length; i++) {
if (this[i] === me) {
has = true;
break;
}
}
if (has) {
delete this[i];
for (i = i; i < this.length - 1; i++) {
this[i] = this[i + 1];
}
this.length--;
}
};
紧接着,我将相应的私有变量、函数和类的实体定义在一个函数内,并立即执行这个函数:
(function () {
var callback = new callbackList();
var test = function () {
}
test.prototype.addme = function (me) {
callback.add(me);
}
var invokemethod = function () {
for (var i = 0; i < callback.length; i++) {
callback[i]();
}
window.document.detachEvent("onreadystatechange", invokemethod);
}
window.document.attachEvent("onreadystatechange", invokemethod);
window.test = test;
return test;
})();
从上面的代码大家可以看见我定义了私有变量callback,私有函数invokemethod,以及类test,并且将test变为全局可见的类(通过window.test = test实现)。最后将window.document的onreadystatechange挂上invokemethod方法。由于他们都是在一个函数体内的,所以他们相互之间都是可见的。
那么下面的代码就会触发相应的事件:
function f1() {
alert("f1");
}
function f2() {
alert("f2");
}
function f3() {
alert("f3");
}
function f4() {
alert("f4");
}
var t1 = new test();
t1.addme(f1);
t1.addme(f2);
var t2 = new test();
t1.addme(f3);
t1.addme(f4);