关于Ajax的MicrosoftAjax.js的心得(-)
看了MicrosoftAjax.js中的代码,发现其对javascript中的对象(window、Object、Function、Date、Error,String等等)都通过prototype(原型)属性做了扩展。
prototype可以看成创建新对象的原型。
先看以下Ajax的Client的代码
Type.registerNamespace("wallis");
wallis.Animal=function(name)
{
this._name=name
}
wallis.Animal.prototype=
{
get_name:function()
{return this._name;},
set_name:function(value)
{this._name=value},
eat:function()
{
alert(this._name)
}
}
}
wallis.Animal.registerClass("wallis.Animal");
var cat=new wallis.Animal("cat");
cat.eat();
Type.registerNamespace("wallis");大家都很熟悉吧,就是注册命名空间。
registerClass 就是注册类。
接下来就看一下它是如何工作的:
看MicrosoftAjax.js中的代码
if (!window) this.window = this;
window.Type = Function; //window.Type引用Function对象
.........
.........
Type.registerNamespace = function Type$registerNamespace(namespacePath)
{
/// <summary locid="M:J#Type.registerNamespace" />
/// <param name="namespacePath" type="String"></param>
var e = Function._validateParams(arguments, [
{name: "namespacePath", type: String}
]);
if (e) throw e;
if (!Type.__fullyQualifiedIdentifierRegExp.test(namespacePath)) throw Error.argument('namespacePath', Sys.Res.invalidNameSpace);
var rootObject = window;
var namespaceParts = namespacePath.split('.');
for (var i = 0; i < namespaceParts.length; i++) {
var currentPart = namespaceParts[i];
var ns = rootObject[currentPart];
if (ns && !ns.__namespace) {
throw Error.invalidOperation(String.format(Sys.Res.namespaceContainsObject, namespaceParts.splice(0, i + 1).join('.')));
}
if (!ns) {
ns = rootObject[currentPart] = {
__namespace: true,
__typeName: namespaceParts.slice(0, i + 1).join('.')
};
if (i === 0) {
Sys.__rootNamespaces[Sys.__rootNamespaces.length] = ns;
}
var parsedName;
try {
parsedName = eval(ns.__typeName);
}
catch(e) {
parsedName = null;
}
if (parsedName !== ns) {
delete rootObject[currentPart];
throw Error.argument('namespacePath', Sys.Res.invalidNameSpace);
}
ns.getName = function ns$getName() {return this.__typeName;}
}
rootObject = ns;
}//
我们看一下这几句代码
if (!ns) {
ns = rootObject[currentPart] = {
__namespace: true,
__typeName: namespaceParts.slice(0, i + 1).join('.')
};
其实是把我们注册的namespace添加到了window的对象中
这样我们就可以直接使用注册的namespace来操作了。
例如:
Type.registerNamespace("wallis");
wallis.Animal=function(name)
接下来我们看这句代码
wallis.Animal.registerClass("wallis.Animal");
registerClass又是在哪里定义的呢?
在MicrosoftAjax.js中我找到
Type.prototype.registerClass = function Type$registerClass(typeName, baseType, interfaceTypes)
可这个是如何与 wallis.Animal关联的呢
是这样的:
wallis.Animal=function(name)
这句代码就把Animal指向了一个Function对象,由于window.Type是指向Function的,Type.prototype.registerClass给Function添加了原型对象,所以当我们在Ajax中创建Function对象时就会自动创建registerClass
写得有点乱,第一次写,请多指教:)