• 关于Ajax的MicrosoftAjax.js的心得(-)


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


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



  • 相关阅读:
    hystrix 源码分析以及属性的配置
    golang官方包限流器使用和原理(golang.org/x/time/rate)
    pip通过指定分支和子目录从git仓库中拉取python包
    cgo使用示例总结
    python装饰器原理和用法总结
    centos7编译安装clang8(同时还会编译llvm的不少东西, 文中附带编译好的二进制压缩包)
    prometheus+alertmanager+granafa监控总结,安装基于docker-compose(长期更新)
    go条件变量的使用和原理
    canal+kafka订阅Mysql binlog将数据异构到elasticsearch(或其他存储方式)
    go对elasticsearch的增删改查
  • 原文地址:https://www.cnblogs.com/wallis0922/p/1009172.html
Copyright © 2020-2023  润新知