在JavaScript中使用面向对象
2010-09-14 13:20:02 来源:WEB开发网修改后的另一个版本:
member1='test';
functionabc()
{
alert(this.member1);
}
varobj={member1:"Helloworld",show:abc};
varobj2={member1:"Helloworldagain",show:abc};
obj.show();
//也可以使用
abc.call(obj);
abc.call(obj2);
abc();//此时abc中的this指向了当前上下文
每个函数都有call方法,上面的过程中我们看到用另一个对象代替调用显示方法,并注意到this在对象上下文中的改变。
通过上面基础知识的研究,让我们再向前跨出一步,使用call的特性来实现类继承,参见下面示例:
//统一类构造器
functionMyClassInitor()
{
this.base();
if(!this.mm)
alert('未定义成员函数:mm()');
returnthis;
}
//定义一个基类
functionbaseClass()
{
if(!this.tt)//判断该成员是否被继承类覆盖
this.tt='基类成员';
}
//从基类继承
varobj={member1:"Helloworld",base:baseClass,gg:function(){alert('IamanGG');}};
varobj2={member1:"Helloworldagain",base:baseClass,mm:function(name){alert('IamMM'+name+'.');},tt:"覆盖基类的tt成员"};
varo=MyClassInitor.call(obj);
varo2=MyClassInitor.call(obj2);
alert(o.tt);
alert(o2.tt);
o2.mm('Mary');
虽然跟高级编程语言的语法有点不同,但是你必须了解JavaScript的语法特点。通过这个例子,我们什么分析了this和call的配合,但是实际进行类继承设计时往往不会采用此方法进行实现,后面我们介绍Prototype时再做详细介绍。
命名空间
前面我们了解完类、对象的声明,下面看一下Javascript中命名空间的处理,大家知道,在高级编程语言中我们非常熟练的使用命名空间来避免变量或方法名的冲突,那么同样我们也可以在JavaScript中使用命名空间来为我们的类和方法进行界定。在JavaScript中命名空间的声明与其它高级语言略有不同,下面是一个命名空间声明的示例:
varSystem={};
varSystem.Web={};
通过这两行代码我们就有了System和System.Web两个命名空间,回想一下前面我们介绍的知识,你很快可以发现,这是两个对象声明语句。在JavaScript中,我们正是使用对象来表示命名空间的。但是你必须清楚一点,由于JavaScript的特性,在实际应用中,我们不能这么简单的来处理命名空间,因为声明语句可能同时出现在多个地方或者多个js文件中,我们知道,在JavaScript中,最后声明的变量会覆盖前面同名的变量,因此通常我们要加一些判断代码来防止重复声明,例如:
if(typeofSystem=='undefined')varSystem={};
这样即使这段代码在程序中重复出现多次我们也可以保证System对象只声明一次。关于这一点,大家如果深入研究过AjaxPro和其它很多大型JavaScript框架,会发现当配合后端应用程序的时候,它是多么的有用。例如AjaxPro的类型注册,。
Tags:JavaScript 使用 面向
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接