Flyingis
Mushup--思想流动,相互融合
博客园
首页
新随笔
新文章
联系
管理
订阅
随笔- 88 文章- 8 评论- 828
JavaScript 中的对象
作者:
Flyingis
面向对象语言需要具备三种基本特征:继承(Inheritance)、多态 (Polymorphism) 、封装(Encapsulation and Aggregation)。和Java 、C++ 等语言一样,ECMAScript 被认为是面向对象的,因为它同时支持这些特征。
var
obj
=
new
Object();
该语句创建了一个对象,当构造函数没有参数时,可以省略后面的括号。我们通常是通过对象的引用来进行对象操作,当一个对象的引用为null时, ECMAScript将启动垃圾回收程序删除该对象,释放内存。当一个对象存在多个引用时,需要将所有的引用设置为null来释放该对象所占用的空间。
1 早期绑定和动态绑定
早期绑定是指在对象被实例化之前对象的属性和方法已经被定义,使得编译器或解释器能够提前编译机器码。Java和VB支持这种特性,但ECMAScript 并非强类型,不支持早期绑定。
动态绑定是指编译器或解释器在运行时才知道该对象的具体类型,之前并不会检查,只会判断这些属性和方法是否得到该对象的支持。ECMAScript对所有的变量使用动态绑定。
2 对象类型
2.1 原始对象
ECMA-262 定义不受主机环境影响的ECMAScript支持的任意对象为原始对象,简而言之,原始对象就是ECMA-262定义的引用类型,比较常用的有 Object、Function、String、Boolean、Number、Array、Date。
Array
Array 有许多常用的方法,很多和Java类似,在此不作介绍。需要注意的是,使用push()和pop()两个方法,可以将Array看作一个栈,遵循后进先出规则(LIFO)。使用shift()和push()两个方法,Array对象即可看作是一个队列,遵循后进后出的规则(LILO)。splice()方法非常有用,它轻松的实现了链表的一些基本功能,如删除数据项、插入数据、替换数据。
Date
ECMAScript 中的Date类是基于Java早期版本中的java.util.Date类的,它可以精确表示1970年1月1日(格林威治时间)前后285616年的任意时间。Date是少有的几个重写了toString()和valueOf()方法,并且两个方法并不相同的类。valueOf()通常表示精确到毫秒级的时间,toString()通常返回个性化的时间表示方法,例如相同的时间在不同浏览器下显示的效果可能不一样。
2.2 Build-in对象
Build-in 对象除了具备原始对象的基本特性外,它在 ECMAScript 程序开始运行时就可以使用,因此可以说任何 Build-in 对象就是原始对象。目前 ECMA-262 只定义了两个 Build-in 对象: Global 和 Math 。
Global
在ECMAScript 里,没有函数可以单独存在,所有的函数都必须是某个对象的方法。如isNan()、isFinite()、parseInt()、parseFloat ()、encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent() 等均是Global对象的方法,除此之外,Global对象还包括一些属性。
Math
Math中有许多属性和方法可以用于数学计算,和Java中的比较类似。
2.3 Host 对象
除了原始对象和Build-in对象外,其他对象均是Host对象。所有的BOM和DOM对象均被认为是Host对象。
3 类成员的访问方式
在面向对象语言程序设计中,常见的类成员访问方式有public、protected和private。在ECMAScript中,只有public一种访问方式,对象中所有的属性和方法都是可见的,因此,在程序设计时需要额外注意系统安全性的问题。在没有合理的程序规范之前,程序员在编写 ECMAScript代码时,通常使用一定规范的命名方式来说明该属性或方法是私有的(仅仅是说明而已,实际上还是公有的),例如在名称前后加上下划线,或只在名称前加下划线。另外,在ECMAScript中没有static方法。
4 this关键字
this关键字是ECMAScript中一个非常重要的概念,通常在对象的方法中使用。
function
whatFruit()
{
alert(
this
.color);
}
var
table1
=
new
Object;
table1.fruit
=
"
apple
"
;
table1.whatFruit
=
whatFruit;
var
table2
=
new
Object;
table2.fruit
=
"
pear
"
;
table2.whatFruit
=
whatFruit;
table1.whatFruit();
//
输出apple
table2.whatFruit();
//
输出pear
当一个变量前面没有对象或this来引用时,ECMAScript认为该变量是一个本地的或全局变量,于是在本地和全局中去搜寻该变量,如果最后仍没有找到,将会在alert中输出null。
5 自定义类和对象
5.1 工厂方法
在ECMAScript中创建工厂方法,返回一个特定类型的对象,以此实现代码的简洁适用。
function
createFruit()
{
var
tempFruit
=
new
Object;
tempFruit.name
=
"
apple
"
;
tempFruit.number
=
5
;
tempFruit.showName
=
function
()
{
alert(
this
.name);
}
;
return
tempFruit;
}
var
Fruit1
=
creatFruit();
var
Fruit2
=
creatFruit();
在createFruit()中可以加入形参来传入参数的值。随着ECMAScript不断被规范化,这种创建对象的方法已不再流行,一部分原因是语法上的,一部分原因是功能上的,如每个对象的实例都拥有属于自己的showName方法,给内存管理带来一定的开销。
5.2 构造函数
选择一个类名,第一个字母大写,该类名即是构造函数的名称。创建一个构造函数和工厂方法比较类似,不同的是需要使用关键字new来创建对象的引用。使用构造函数的方式来创建对象和使用工厂方法有着相同的弊端。
function
Fruit(name, number)
{
this
.name
=
name;
this
.number
=
number;
this
.showName
=
function
()
{
alert(
this
.name);
}
;
}
var
Fruit1
=
new
Fruit(
"
apple
"
,
5
);
var
Fruit2
=
new
Fruit(
"
pear
"
,
3
);
5.3 使用 Prototype
使用prototype属性可以用来创建新的对象,首先需要一个空的构造函数建立类的名称,然后所有的属性和方法都直接分配到prototype属性中。
function
Fruit()
{
}
Fruit.prototype.name
=
"
apple
"
;
Fruit.prototype.number
=
5
;
Fruit.prototype.showName
=
function
()
{
alert(
this
.name);
}
;
var
fruit1
=
new
Fruit();
var
fruit2
=
new
Fruit();
但是,这样同样存在一些缺点。首先,构造函数中没有参数,给初始化带来一些麻烦,其次,当一个属性指向的是一个对象而非方法时,该对象会被所有的实例所共享,任何一点改动都会影响到其他对象引用的使用。
5.4 混合使用工厂方法和Prototype
这个概念很简单:使用构造函数定义所有除方法外的属性,使用 prototype 定义对象的方法。这样每个方法只会被创建一次,每个对象都能拥有自己对象实例的属性。
function
Fruit(name, number)
{
this
.name
=
name;
this
.number
=
number;
this
.owner
=
new
Array(
"
Jerry
"
,
"
Terry
"
);
}
Fruit.prototype.showName
=
function
()
{
alert(
this
.name);
}
;
var
Fruit1
=
new
Fruit(
"
apple
"
,
5
);
var
Fruit2
=
new
Fruit(
"
pear
"
,
3
);
5.5 动态 prototype
简单来说,这种方法就是使用了一个标识符来判断 prototype 是否已经被指向某个方法,从而保证这些方法只会被创建并指向一次。
5.6 混合工厂方法
这种方法和经典的工厂方法及构造函数方法在对象方法内存管理上存在同样的问题,一般不建议使用该方法,除了某些特殊情况(XML in JavaScript中有这样的例子)。
6 修改对象
使用prototype对象可以对对象进行修改。除了用户自定义的对象外,ECMAScript原始对象也有prototype属性。直接使用 prototype可以给对象创建新的方法。
Number.prototype.toHexString
=
function
()
{
return
this
.toString(
16
);
}
;
var
iNum
=
10
;
alert(iNum.toHexString());
//
输出A
另外,使用prototype可以轻松修改已有的方法,让方法名指向新的方法。需要注意的是,指向新的方法后,原有的方法不再被任何对象使用,将会被垃圾回收器销毁,使得原有方法不再存在。比较安全的解决办法是,建立一个新的引用来保存原有的方法,然后再将原方法覆盖。
比较特殊的是,ECMAScript中创建对象,在对象引用被创建后,可以给对象加入新的方法,并且可以立即在对象的引用中使用。这是ECMAScript的一个特性,但不推荐这样使用,以免带来不必要的麻烦,例如阅读理解、文档资料等。
参考书籍:
Nicholas C.Zakas
《Professional JavaScript for Web Developers》
Tag标签:
javascript
posted on 2008-04-15 14:28
Flyingis
阅读(208)
评论(2)
编辑
收藏
所属分类:
JavaScript
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-04-15 14:46 编辑过
另存
打印
所属分类的其他文章:
·
JavaScript 中的继承
·
JavaScript 中的对象
·
ECMAScript 基础
·
JavaScript 基本组成
最新IT新闻:
·
奇虎回应:瑞星半年免费版像是一个恶意软件
·
鲍尔默致员工信:部署09年微软5大工作重心
·
陈一舟:Facebook也抄袭过校内 不怕打官司
·
微软重组视窗与在线业务
·
我国网民数达2.53亿超美国居世界首位
博客园新闻频道
博客园首页
社区
公告
1.本博客上的任何言论仅代表个人观点,与作者所在的公司没有任何关系。所有贴子皆以“现状”提供且没有任何担保,同时也没有授予任何权利。
2.非特殊说明,本站遵守“
创作共用
许可署名。
<
2008年7月
>
日
一
二
三
四
五
六
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
与我联系
发短消息
留言簿
(57)
给我留言
查看留言
我管理的小组
GIS开发
GIS.DeveloperUnion
我参加的小组
ASP.NET
设计模式
web标准设计
我参与的团队
WebGIS(0/861)
ASP.NET AJAX (Atlas)学习(0/1319)
GIS.DeveloperUnion(开发者联盟)(0/738)
开源GIS学习(0/224)
我的标签
arcgis server
(16)
安装
(7)
dojo
(6)
javascript
(5)
arcgis
(5)
javascript api
(4)
补丁
(3)
ajax
(3)
solaris
(3)
vi
(2)
更多
随笔分类
.Net Framework
ArcEngine(10)
ArcGIS Desktop(6)
ArcGIS Server(24)
ArcIMS(10)
ArcSDE(4)
Diary(8)
GIS 其他(17)
Js|REST API(5)
Linux/Unix(2)
Web 用户体验(2)
随笔档案
2008年7月 (10)
2008年5月 (1)
2008年4月 (8)
2008年3月 (6)
2008年2月 (3)
2008年1月 (8)
2007年12月 (6)
2007年10月 (3)
2007年9月 (5)
2007年8月 (6)
2007年7月 (4)
2007年5月 (2)
2007年4月 (6)
2007年3月 (4)
2007年1月 (3)
2006年11月 (2)
2006年9月 (2)
2006年7月 (4)
2006年4月 (1)
2006年1月 (3)
文章分类
JavaScript(4)
Technology(3)
文章档案
2008年4月 (6)
2005年12月 (2)
收藏夹
测试(1)
个人博客
Flyingis in 3sNews
Flyingis in blogjava
包含Java/Javascript/GIS等一些文章,已停止更新
客户端技术
Dojo
mooTools
prototype
我喜欢的地方
flickr
豆瓣
鲜果
译言
友情链接
GaoYang
Mars
空明流转
蓝色森林
骆驼人
棕熊@Think Fast
搜索
积分与排名
积分 - 139667
排名 - 249
最新评论
1. re: 深入浅出 Javascript API(四)--绘制 Graphics
汗.这个怎么使用esri的API,我还以为JS 内置的API咯......
要是有的话,LZ写出来看看
--egmkang
2. re: Ags 9.3 文档逐步上线
博主,9.3的安装文件在哪下载?
--江南白衣
3. re: 深入浅出 Javascript API(四)--绘制 Graphics
高手。
--zoti
4. re: 深入浅出 Javascript API(四)--绘制 Graphics
有点难度
--专研.NET
5. re: 深入浅出 Javascript API(三)--地图配置
Ags93 javascript&rest api可以调用大多数服务器端的功能(包括新增Geometry服务和GP),如果不是要有状态编辑,一般都可以胜任了,目前webgis主流还是轻量级应用...
--Flyingis
阅读排行榜
1. ArcGIS Server 开发系列(二)--Web ADF 编程(4820)
2. ArcGIS Server 开发系列(四)--ArcGIS Server data sources 开发(4433)
3. BlueViewer 地图加载分析(C#)(4192)
4. ArcGIS Server 开发系列(一)--编程框架总览(4034)
5. ArcGIS Server 开发系列(五)--自定义 Toolbar 工具(3823)
6. ArcGIS 坐标系统文件(3604)
7. ArcGIS Server 开发系列(三)--漫游 Graphics data sources(3118)
8. ArcGIS 9.2 SP2 补丁开始提供下载(3074)
9. Geometry 对象浅析(2846)
10. ArcIMS 连接器--.NET Link 使用方法(2657)
11. ArcGIS Server 体系结构(2544)
12. 乱谈 GIS 中小型应用(2517)
13. 全套 ArcGIS 软件安装(Windows 平台)(2495)
14. ArcGIS Server 开发系列(六)--自定义 Tasks(2460)
15. DBMS的空间扩展(2259)
16. Dojo 之 面向对象(2250)
17. .Net Web ADF 应用中的安全技术(2005)
18. 网站项目管理(1959)
19. ArcGIS Server 9.3 beta 体验二 -- 开发路线(1915)
20. ArcIMS体系结构(1820)
评论排行榜
1. BlueViewer 地图加载分析(C#)(108)
2. ArcGIS Server 开发系列(五)--自定义 Toolbar 工具(107)
3. 长期提供orkut / gmail 邀请(82)
4. ArcGIS Server 开发系列(四)--ArcGIS Server data sources 开发(70)
5. ArcGIS Server 开发系列(六)--自定义 Tasks(65)
6. ArcGIS Server 开发系列(三)--漫游 Graphics data sources(42)
7. ArcGIS Server 开发系列(二)--Web ADF 编程(30)
8. ArcIMS 连接器--.NET Link 使用方法(29)
9. ESRI中国(北京)招聘ArcIMS售后技术工程师(16)
10. ArcGIS Server 9.3 beta 体验二 -- 开发路线(16)