ECMAScript中的任何function函数都可以看作是Function类的实例,比如对sayhi函数的定义,1和2的效果是一样的。
1 function sayhi(sName){ alert("Hello" + sName); }
2 var sayhi = new Function("sName","alert("Hello " +sName ); ");
除了Function类,ECMAScript还提供了Object、String、Boolean、Number 、Array、Date、Math等类,我们还可以定义新的类或拓展已有的类。
ECMAScript定义类的主要方式是混合的构造函数/原型方式,用构造函数定义类的非函数属性,用原型方法定义类的函数属性(方法)。相对于单纯的构造函数或原型方式,它的好处是所以函数都只创建一次,而每个对象都具有自己的对象属性实例,比如:
function Car(sColor,iDoors)
{
this.color = sColor;
this.doors = iDoors;
}
Car.prototype.showColor = function(){ alert(this.color); }
在构造函数/原型方式上的进一步包装是动态原型方法,它更符合OO风格,定义如下:
function Car(sColor,iDoors)
{
this.color = sColor;
this.doors = iDoors;
if(typeof Car._initialized == "undefined")
{
Car.prototype.showColor = function(){ alert(this.color); }
}
Car._initialized = true;
}
ECMAScript中实现对自定义对象的继承,主要是通过对象冒充的方式,但这需要理解函数的工作方式和this关键字。其原理如下:构造函数使用this关键字给所有属性和方法赋值。因为构造函数只是一个函数,所以可以使ClassFather的构造函数成为ClassChild的方法,然后调用它。ClassChild就会接收到ClassFather的构造函数中定义的属性和方法。例如:
function ClassFather(sColor)
{
this.color = sColor;
this.sayColor = function(){ alert(this.color); };
}
function ClassChild(sColor,sName)
{
//继承的属性方法
this.FatherMethod = ClassFather;
this.FatherMethod(sColor);
delete this.FatherMethod;
//新属性新方法
this.Name = sName;
this.sayName = function(){ alert(this.Name); };
}
ECMAScript第三版引入了call和apply方法,用来支持上面的继承方式(两个函数的具体说明请Google或Baidu,有N多相关资料),call()方法的应用如下:
function ClassChild(sColor,sName)
{
//继承的属性方法
//this.FatherMethod = ClassFather;
//this.FatherMethod(scolor);
//delete this.FatherMethod;
ClassFather.call(this,sColor);//这里的this是ClassChild的实例,用来冒充ClassFather的对象
//新属性新方法
this.Name = sName;
this.sayName = function(){ alert(this.Name); };
}
我们知道封装大师微软M$对 Javascript进行包装的结果是ASP.NET AJAX Client Library,它对ECMAScript的基础类型进行了扩展,提供了JS面向对象的支持和组件的扩展。把一种基于对象和事件驱动的脚本型动态语言包装成藐视面向对象的语言,看起来真的非常神奇,但如果你稍微研究下 C:Program FilesMicrosoft ASP.NETASP.NET 2.0 AJAX Extensionsv1.0.61025MicrosoftAjaxLibrarySystem.Web.Extensions 1.0.61025.0下的MicrosoftAjax.debug.js文件,就会发现:噢,没什么了不起得,不就利用了上面所述的 ECMAScript中的那些东西嘛!有些高手甚至提出这样的疑问:ASP.NET AJAX Client Library: 更繁?更简
确实对于小型的个人应用,完全没有必要用ASP.NET AJAX Client Library,但对于大型应用和后期维护还是很有好处的,比如ArcGIS Server Web ADF JavaScript Library,它完全基于 ASP.NET AJAX Client Library,它是ArcGIS Server Web ADF提供的一套复杂的客户端框架,通过这套框架可以在脚本环境中与Web ADF控件或组件进行交互。这将意味着你可以使用javascript和Web ADF控件进行交互,比如浏览地图,添加graphics到地图上,创建map tips,不需要任何的服务器端代码。从另一个角度来说,Web ADF JavaScript Library为web adf开发人员提供了另外一个工具。Web ADF JavaScript 设计用来利用客户端的技术来增强Web ADF应用,以支持客户端/服务器端的同步以及纯客户端的交互,而不是代替服务器端编程独立使用的。这套library只要页面中有Web ADF控件便可使用,它不需要独立安装,嵌入在web adf控件中,不可更改。它在Web ADF之外不可使用,它主要用来配合arcgis server web adf进行开发使用的。
Web ADF JavaScript Library依赖于ASP.NET AJAX JavaScript Library,ASP.NET AJAX JavaScript Library提供了一个复杂的基础,在此基础上用来创建AJAX的解决方案。它管理着客户端与远程服务,以及服务器端的控件的交互。它提供一种机制在客户端呈现Web控件以及客户端的事件处理。另外,它提供了跨浏览器的支持,所有的这些特性都在Web ADF JavaScript Library被使用了。
既然说到了ArcGIS Server中的javascript,那就顺便提一下ArcGIS JavaScript API,ArcGIS JavaScript API是用来嵌入GIS地图和任务到GIS Maps中的一种轻量的方式,它是免费使用和部署的,它需要的就是ArcGIS Server提供的可用的地图和工具。ArcGIS JavaScript API是一套基于客户端的API,用于开发高性能,易于使用的地图应用。它使你非常容易在你的网页中嵌入地图。ArcGIS JavaScript API适用于非GIS专业人士,但是又需要在Web网页中嵌入地图的情况。它使用容易,不需要了解类似于象ArcGIS Server这样的GIS专业开发软件,只需要了解javascript,便可以在非GIS的web应用中嵌入和使用地图。通过它可以:
1 显示一幅定制的专业的地图
2 在服务器端执行一个GIS model并且在客户端显示结果
3 在ArcGIS Online base map上显示自己的数据
4 在GIS数据中搜索要素以及属性并显示结果
5 搜索地址并显示结果 。。。。。。
为ArcGIS Server开辟江山立下汗马功劳的WebADF虽然在ServerGIS上是那么的全能,但在大多数情况下,GIS都是作为特定的业务嵌入在一些MIS 中的,相比购买WebADF这辆悍马来说,还是直接驾驭ArcGIS JavaScript API以及后来的Flex API,Siverlight API更轻快些,前端的效果也更炫一些,好像扯得有点跑题了。。。。。。刹车了