javascript仿真类机制与私有变量的方法与思路

在使用Javascript框架时,您可能会看到类似的代码。
复制代码代码如下所示:
Var MyClass =新类({
初始化:函数(参数…){
this.param =参数;

},
func1:功能(…){

}
});
var =新MyClass(参数)myobj时;
myobj.func1(…);

这是一个典型的面向对象的类机制应用程序,它比原生Javascript类机制更清晰、更自然,并在此基础上更方便地实现类的继承,这是如何实现的呢
众所周知,在Javascript中,您可以创建一个函数作为构造函数的对象,上面的代码可以简单地写成:
复制代码代码如下所示:
函数的MyClass(参数){
this.param =参数;
this.func1 =功能(..){

};
}
var =新MyClass(参数)myobj时;
myobj.func1();

事实上,它非常简单,而且不难理解。但是,如果我们想构建一个大型Javascript类库,它可能会让人迷惑。从一堆代码中,我们需要找出哪些是类,哪些是函数,哪些是类方法,哪些是类属性。
当然,这并不是要比较它们的优缺点,而是要对新类实现的方式感到好奇。
In the code above, the use of new (MyClass) this statement means that MyClass must be a function, it also means that new Class needs to return a function object that can be seen from the literal meaning, the function initialize is used as a constructor, so the function new Class returns. 您必须使用初始化来初始化对象。基于此分析,我们可以得到以下代码:
复制代码代码如下所示:
函数类(观点){
返回函数(){
VaR init =争论{ 'initialize}功能(| |){ }; / /如果没有构造函数初始化一个空函数,使用默认构造函数
对于(VAR P型){
这{ p } = { p型};
}
Init.apply(这个参数); / /使用函数代替原来的这个函数初始化
}
}

上面的代码是不够严谨,但足以说明问题。注意,init.apply(这个观点)这句话,有指几个变量,一个是这个,这个在默认的原来的初始化,现在已经不是该回到匿名函数和匿名功能,由于新类,新类的构造函数的定义。其他的参数,它指的是匿名函数的参数,即,在MyClass的新的参数(参数)以上。
这个转换有点头晕,有没有更简单的方法呢请看下面的代码:
复制代码代码如下所示:
函数类(观点){
var obj参数{ 'initialize}(功能){ } = | |;
对于(VAR P型){
obj。原型{ p } = { p型}; / /注意,这里是原型
}
返回对象; / /事实上或返回一个函数
}

哦,我感觉很迟钝。
这就完成了一个简单的类机制的构造,通过这个机制,我们可以创建类的构造函数、方法和属性,但这些显然是公开的。那么我们如何实现私有变量和方法呢
我们知道Javascript类的私有变量可以通过闭包机制完成,但是在用新类({ })转换后,很难形成有效的闭包。如何绕过这个问题
Javascript提供了两种方式:eval()和toString()函数对象的方法。前者比较常见,后者可以用来获得特定的函数代码,通过这两种方法,可以简单地模拟类的私有变量:
复制代码代码如下所示:
函数类(观点){
无功_ =争论{ } { } | |担保的非盈利的;
eval('var obj = +(诐{ 'initialize})| |功能(ToString()){ });
对于(VAR P型){
如果(p'initialize'p | | = = = =担保的非盈利的)
继续;
如果(typeof诐{ p } = = 'function)
eval('obj { } = P。原型+论点{ p } ToString());
其他的
obj。原型{ p } = { p型};
}
返回对象;
}

功能代码的提取是通过toString()函数对象的方法,并通过eval方法执行,以便有效闭合范围可以构造,从而实现民营机制,我们可以应用如下:
复制代码代码如下所示:
var =新类({
私募:{
身高:160,
重量:50
},
初始化:函数(名称,高度,重量){
this.name =名称;
_。高度=高度_高度| |;
_。重量=体重_重量| |;
},
显示:函数(){
('name警觉:+ this.name + / nheight:+ _。高度+ / nweight:+ _。重量);
}
});
我的新个人VaR(深航);
My.show();

它看起来不太好,但在实际应用中,它与它没有太大关系,主要是在效率方面,它比通常的实现方式花费了大约四倍的时间。在大型类库的构建中,这是不能容忍的,在小应用中,下面的代码更简单、更直接:
复制代码代码如下所示:
函数的MyClass(参数){
无功privatevar =…;
this.param =参数;
this.func =函数(){
警报(privatevar);
};
}