ASP.NET AJAX Client Framework 源码追踪 3 程序的入口点

3. 程序的入口点

察看源码,首先要找到程序的入口点。c/c ++是main函数,windows下是winmain(),.net/java是public static void main()。那么什么是javascript的入口点呢?我们知道javascript是解释语言,javascript引擎解释一段代码,然后运行之。

一个有趣的问题是要解释多少才运行呢?作个小试验就行了。
None.gif < script >
None.giftest();
None.gif
function  test()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif alert(
"test");
ExpandedBlockEnd.gif}

None.gif
</ script >
None.gif
运行正常,说明javascript引擎不是解释一行,运行一行的。因为test()的定义在其运行之后的。那如果是这样呢?
None.gif < script >
None.giftest();
None.gif
</ script >
None.gif
< script >
None.gif
function  test()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif alert(
"test");
ExpandedBlockEnd.gif}

None.gif
</ script >
None.gif
结果浏览器会报错。ie和firefox是一样的。结果很清楚,javascript解释一段代码,然后运行这一段刚刚解释过的代码。这一段是指的是包括在<script>之下的一段代码。

那现在看来,javascript的程序的入口点,即第一行程序运行,是第一个<script>代码段中的第一行。对于ASP.NET AJAX framework来说,就是第一个引用的js文件,即MicrosoftAjax.js,中的第一行运行代码
Function.__typeName = 'Function';

我们已经找到了程序的入口点,一行一行的看下去就是了。但是要看到哪里呢?回到主页面,注意下面这行代码
Sys.Application.initialize();
嗯,Application class。一个class能叫Application,肯定是总揽全局,负责整个程序的运行的干活。看看官方文档,
Application class
Provides members that support client component development. This is a static class that is invoked directly without creating an instance of the class.
The Sys.Application object provides functions and events supporting client component development. A single instance of the Sys.Application object is created for each application. The Sys.Application object is responsible for calling client page life-cycle events such as pageInit(), pageLoad(), pageUnload(), and is responsible for binding and unbinding components to these events.
果然Application class不仅仅在每一个程序中被创建,还要负责整个客户端页面的生命周期。尤其是init, load事件,怎么这么眼熟,闻起来好像asp.net中的page class。下面我们就看看它是在那里被创建。
运行我最喜欢的编辑器gvim,打开MicrosoftAjax.js文件,键入"/application",哇,这application出现的次数还是蛮多的。不对,怎么都叫_application啊。经过_application的prototype block,定位到这一行,
Sys.Application = new Sys._Application();
原来如此,Sys.Application是Sys._Application的一个实例。怎么官方文档说它是一个静态对象啊!还不需要创建实例,它根本就是另一个对象的实例嘛。
不管怎么说,找到了Application的实例,在深入探讨它之前,我们先看看ASP.NET AJAX在创建它之前都干了些什么。简单,键入F5,一行一行运行就是了。

1.首先,给Function对象添加扩展的属性和方法。
__typeName
createCallback
createDelegate
emptyFunction
_validateParams
_validateParameterCount
_validateParameter
_validateParameterType
2.给Error对象添加扩展的属性和方法:
__typeName
create
argument
argumentNull
argumentOutOfRange
argumentType
argumentUndefined
invalidOperation
notImplemented
parameterCount
popStackFrame
3. 注意了,这句代码令人费解
if (!window) this.window = this;
难道是有的浏览器没有内建window对象?
4. 添加window对象扩展的属性和方法
window.Type = Function;
5. 添加Type对象扩展的属性和方法。实际上还是Function对象,因为上面的代码把Function对象作为window对象的一个属性。
callBaseMethod
getBaseMethod
getBaseType
getInterfaces
getName
implementsInterface
inheritsFrom
initializeBase
isImplementedBy
isInstanceOfType
registerClass
registerInterface
resolveInheritance
getRootNamespaces
isClass
isInterface
isNamespace
parse
registerNamespace
6. 添加object对象的扩展的属性和方法
__typeName
getType
getTypeName
7. 添加对boolean对象的扩展的属性和方法
__typeName
parse
8. 添加对Date对象的扩展的属性和方法
__typeName
9. 添加对Number对象的扩展的属性和方法
__typeName
parse
10. 添加对RegExp对象的扩展的属性和方法
__typeName
11. 添加对Array对象的扩展的属性和方法
__typeName
add
addRange
clear
clone
contains
dequeue
forEach
indexOf
insert
parse
remove
removeAt
12. 添加对String对象的扩展的属性和方法
__typeName
endsWith
startsWith
trim
trimEnd
trimStart
format
13. 注册 sys namespace
14. 定义Sys.IDisposable
15. 定义Sys.StringBuilder
16. 定义window.XMLHttpRequest
17. 定义Sys.Browser。注意了,ASP.NET AJAX提供了不同浏览器的支持,如果我们需要在程序中分辨不同的浏览器,可以直接判断Sys.Browser.agent。可以看到目前ASP.NET AJAX支持ie,firefox, safari和opera。
18. 注册Sys.UI namespace
19. 定义Sys._Debug,并生成debug实例。可以用debug.trace("something")来添加调试信息。前提是在页面上要提供一个名为TraceConsole的TextArea。
20. 加入enum支持。
21. 定义Sys.EventHandlerList
22. 定义Sys.EventArgs
23. 定义Sys.CancelEventArgs,奇怪的名字
24. 定义Sys.INotifyDisposing
25. 定义Sys.Component
26. 定义Sys.UI.MouseButton
27. 定义Sys.UI.Key
28. 定义Sys.UI.DomEvent
29. 定义Sys.IContainer
30. 定义Sys.ScriptElementEventArgs
31. 定义Sys._ScriptLoader
32. 定义Sys._ScriptLoaderTask
33. 定义Sys.ApplicationLoadEventArgs
34. finally,我们的主角出现了!定义Sys._Application,然后实例化Sys.Application。

下一章,我们要仔细剖析_Application class,看看它是怎么样掌控页面的生命周期的。

转载于:https://www.cnblogs.com/bluelotus/archive/2006/12/11/588756.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值