关于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


写得有点乱,第一次写,请多指教:)



posted on 2007-12-21 14:52  账号难注册  阅读(5988)  评论(5编辑  收藏  举报