IE8正式版出来了,喜欢图新鲜的我,便下载了个来安装。但随之,问题也来了,prototype.js框架出了问题,上网查了一下,就顺便下载了prototype对应于IE8的更新版本。打开看了一下代码,发现其中发生了不少变化,但其中有一点让我眼前一亮:javascript原来也可以实现私有方法了。先看一下我的代码:
首先解释一下,对于MyClass.prototype=(function(){... return {...}; })();这个奇怪的东西,因为初学者一定会被它弄得莫名奇妙,当初我第一次看到这种类似的代码,也是不解。
函数的声明方式通常是
function myFun()
{
....;
}
但我也们也可以省去函数名,这样就成了
function()
{
}
问题马上来了,这样声明后,怎么调用它呢?没有名字啊。。。。。其实有些地方,我们只需要用一次某个方法的时候,我们就可以这样声明了,比如这样:
window.οnlοad=function()
{
//页面初始化代码
}
那么接着就是 (function(){})(); 这又是什么意思呢?我们调用一个方法的时候就像这样:
myFun();
所以我们可以这样理解: 在函数名后面加上(),就可以调用它,所以我们声明了一个没有名字的函数function(){} 后,马上调用它,所以就成了 function(){}(); 这个样子了,当然再加上个()调整一下优先级(其实也可以不用加),就成了这样 (function(){})();这种奇怪形式了。至于return {}; 这是json格式,在此不介绍,自己百度一下吧。
OK,既然都明白了,那么运行一下吧。看看结果。
结果?等等,为什么结果是两个test2?这跟我们想要的不一样啊。。。
其实在我的代码中ShowName和setName各留了两行被注释掉的代码
如果在ShowName中直接调用私有方法_ShowName的话,ShowName被应用于实例test1和test2上,但_ShowName却没有,所以在_ShowName中的this.name并没有访问到MyClass中的this.name,而此时_ShowName中的this代表window。所以访问失败,正确的调用应该是_ShowName.call(this); 当然this._ShowName();也是不行的,因为_ShowName并没有被作为prototype的一个成员返回给MyClass。所以其实MyClass并没有_ShowName这个方法。
方法是有些麻烦,但也算是实现了