zoukankan      html  css  js  c++  java
  • 关于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


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



  • 相关阅读:
    uni-app引入自己ui写的icon
    2020.07.17
    读uni-app
    图片上传,配置php以及vue简单实现
    vue子给父组件传值
    vue父子传值以及监听这个值,把值拿到子组件使用不报警告
    vue局部跳转,实现一个类似选项卡tab功能
    vuex的一个demo,数据拿到界面上
    vue-day06&day07----路由、路由常用的配置项、vue路由的内置组件、vue路由跳转的方式、路由传值、路由解耦(路由传值的一种方式)、编程式导航、嵌套路由children、路由元信息meta、路由生命周期(路由守卫)、路由懒加载、vue/cli、webpack配置alias、vue/cli中配置alias、vue-router底层原理、单页面开发的缺点、路由报错
    vue-day06----过渡&动画(transition)、axios、axios以post方式请求数据、axios常用的配置项、axios拦截器、qs处理数据、vue中async和await的使用
  • 原文地址:https://www.cnblogs.com/wallis0922/p/1009172.html
Copyright © 2011-2022 走看看