天天看点

javascript 实现 私有、公有 方法

IE8正式版出来了,喜欢图新鲜的我,便下载了个来安装。但随之,问题也来了,prototype.js框架出了问题,上网查了一下,就顺便下载了prototype对应于IE8的更新版本。打开看了一下代码,发现其中发生了不少变化,但其中有一点让我眼前一亮:javascript原来也可以实现私有方法了。先看一下我的代码:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>Javascript实现私有方法</title>

<mce:script language="javascript" type="text/javascript"><!--

//蓝色_冰点 原创

//声明一个类

function MyClass()

{

this.name="MyClass";

}

MyClass.prototype=(function(){

//私有成员,为了便于区分,我用 _ 作为私有方法的前缀

function _ShowName()

{

alert(this.name);

}

function _setName(value)

{

this.name=value;

}

//公有成员

function ShowName()

{

_ShowName();

//this._ShowName();

//_ShowName.call(this);

}

function setName(value)

{

_setName(value);

//this._setName(value);

//_setName.call(this,value);

}

return {

//在这里,将公有方法作为prototype对象返回

ShowName:ShowName,

setName:setName

}

})();

var test1=new MyClass();

var test2=new MyClass();

test1.setName("test1");

test2.setName("test2");

test1.ShowName();

test2.ShowName();

//访问私有方法

try

{

test1._ShowName();

}

catch(err)

{

alert("试图访问对象的私有方法:/r/n"+err.description);

}

// --></mce:script>

</head>

<body>

</body>

</html>

首先解释一下,对于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这个方法。

方法是有些麻烦,但也算是实现了

继续阅读