JavaScript如何实现“面向对象”的各种特征
JavaScript是一种基于对象的语言,只能使用系统提供的内置对象。如何才能用JavaScript写出象面向对象语言一样的代码呢?下面我就给大家说说我的方法。
1、定义一个类(class & field)
//***********code begin***********
//定义类
function MyClass()
{
this.field1; //定义类的成员
this.field2;
}
var obj = new MyClass(); //调用类
obj.aa = 1; //访问成员
obj = null; //释放对象
//***********code end***********
2、定义类的方法(method)
//***********code begin***********
function MyClass()
{
this.method1 = _func1;
this.method2 = _func2;
//函数
function _func1(aa)
{
//code here
}
}
function _func2(aa,bb) //外部函数
{
//code here
}
var obj = new MyClass(); //调用类
obj.method1("参数"); //调用方法
obj = null; //释放对象
//***********code end***********
注意:a.把一个函数绑定到方法的时候,不能加参数和括号;
b.绑定为方法的函数可以在类的外部或内部(当然,在别的文件中也行)
3、属性(Property)
抱歉,JavaScript不能实现象C#中的属性那样的效果,定义的方法和数据成员都是公有的。
但是,我们可以用方法来访问属性。
//***********code begin***********
function MyClass()
{
var privateData = 0;
this.getData = _func1;
this.setData = _func2;
//获取成员
function _func1()
{
return privateData;
}
//设置成员
function _func2(value)
{
privateData = value;
}
}
var obj = new MyClass(); //调用类
obj.setData(100);
alert(obj.getData());
obj = null; //释放对象
//***********code end***********
注意:a.这里其实是定义一个函数内的局部变量,外部无法访问,所以,访问成员的方法也要定义在类里面。
4、私有成员(public & private)
JavaScript中定义的类中,成员都是可以访问的,就好像默认加上了public。
如何实现成员的私有呢?看了3的例子可能就明白了,在class里面定义局部变量就能够使成员私有。
方法的私有也是一样,只要函数不绑定就行了。
//***********code begin***********
function MyClass()
{
var privateData = 0;
this.getData = _func1;
this.setData = _func2;
//获取成员
function _func1()
{
return privateData;
}
//设置成员
function _func2(value)
{
__privateMethod(); //访问私有的方法,外部不能访问
privateData = value;
}
function __privateMethod()
{
privateData = 1000; //私有方法中访问私有成员
}
}
var obj = new MyClass(); //调用类
obj.setData(100);
obj.getData();
obj = null; //释放对象
//***********code end***********
注意:a.公有方法中能够访问公有的方法和成员,也能访问私有的方法和成员;但是,私有的方法只能访问私有的方法和成员。
5、对对象本身的访问(this)
看了上面一节,朋友们一定发现这样的问题:私有的方法中如何访问对象本身?
如果一个函数,没有采用this.方法名=函数名的格式绑定,那么函数中使用this将产生错误。如何解决呢?
//***********code begin***********
function MyClass()
{
var me = this; //注意这里,将对象本身引用到另外一个对象。
var privateData = 0;
this.publicData;
this.getData = _func1;
this.setData = _func2;
//获取成员
function _func1()
{
return privateData;
}
//设置成员
function _func2(value)
{
this.publicData = 100; //访问共有的数据成员
__privateMethod(); //访问私有的方法,外部不能访问
privateData = value;
}
function __privateMethod()
{
me.publicData = 200; //在私有方法中访问共有方法
privateData = 1000; //私有方法中访问私有成员
}
}
var obj = new MyClass(); //调用类
obj.setData(100);
obj.getData();
obj = null; //释放对象
//***********code end***********
总结:在定义类的时候,将对象本身赋值给一个局部变量,其他函数就能通过访问这个变量来访问类了。
6、函数重载(overload)
函数重载能够通过不同的参数,调用同名的不同函数。JavaScript中也可以,只是要麻烦些:
//***********code begin***********
function func1() //在定义函数的时候可以指定,也可以不指定参数
{
var nArgCount = func1.arguments.length;
switch(nArgCount)
{
case 0: //没有参数
//code here
break;
case 1: //一个参数
//code here
break;
…………
default:
//code here
break;
}
}
//***********code end***********
注意:a.可惜,我还没有想出如何根据参数类型而作出判断的方法。
7、构造函数(Constrcutor)
呵呵,因为类本身就是一个函数,所以把代码直接写在函数里面就相当于构造函数了。
//***********code begin***********
function MyClass()
{
this.publicData;
//下面的代码相当于构造函数
this.publicData = 123;
alert(this.publicData);
}
var obj = new MyClass(); //调用类
obj = null; //释放对象
//***********code end***********
注意:构造函数在这里没有使用参数,可以结合第6个技巧,做出构造函数参数的效果。
8、自定义事件(event)
JavaScript中,函数本身也是对象,可以直接使用,所以,定义自己的事件也很简单。
//***********code begin***********
function MyClass()
{
var privateData = 0;
this.setData = _setData;
this.OnDataChange = null;
function _setData(value)
{
privateData = value;
this.OnDataChange(); //引发事件
}
}
function MyEvent()
{
alert("你改变了数值!");
}
var obj = new MyClass(); //调用类
obj.OnDataChange = MyEvent;
obj.setData(1234);
obj = null; //释放对象
//***********code end***********
好了,以上就是小弟总结出来的技巧,希望对大家有所帮助。
同时,我再次也倡议大家:如果多个函数能够重用,或者解决某个问题能够重用,那么就把这些JavaScript的代码写成一个类。封装性好,重用性也好!
*********************************
* 阿福原创 *
* QQ:12304685 *
* mail:ah_fu126@hotmail.com *
var B=function(){}
var A=B.prototype={
b:123,
a:function(){alert(this.b)}
}
var a=new B();
a.a()
A.a();
--------
var B=function(){}
var A={
b:null
}
A.b=B.prototype={
b:123,
a:function(){alert(this.b)}
}
var a=new B();
a.a()
A.b.a();