• 使用 Microsoft Ajax Library 创建自定义客户端脚本 拓荒者


    MSDN地址:http://msdn.microsoft.com/zh-CN/library/bb386453.aspx

    Microsoft Ajax Library是微软提供的一套基于客户端的Ajax js库,通过在页面中添加ScriptManager控件可以管理这些脚本和任何自定义的脚本。

    本节所介绍的所有内容均依赖于该JS库,与服务器开发无关!

    MS Ajax Library有一些功能:

    • 向js中添加了面向对象的功能,可以使用类、命名空间、继承等组织js代码。
    • 反射功能,在运行时检查客户脚本的结构和组件。
    • 枚举
    • 扩展了JS的基类型,缩短开发时间
    • 更好的调试和跟踪功能。

    JS面向对象的用法

    Type 类为 JavaScript 编程添加了命名空间、类和继承等面向对象的功能。任何使用 Type 类注册的 JavaScript 对象都会自动获得访问此功能的权限。

    //注册命名空间
    Type.registerNamespace("Demo");
    
    //为命名空间添加Person类,后面的方法为Person的构造函数
    Demo.Person = function (firstName, lastName, emailAddress) {
        this._firstName = firstName;
        this._lastName = lastName;
        this._emailAddress = emailAddress;
    }
    
    //Person类的方法
    Demo.Person.prototype = {
        getFirstName: function () {
            return this._firstName;
        },
    
        getLastName: function () {
            return this._lastName;
        },
    
        getEmailAddress: function () {
            return this._emailAddress;
        },
        setEmailAddress: function (emailAddress) {
            this._emailAddress = emailAddress;
        },
    
        getName: function () {
            return this._firstName + ' ' + this._lastName;
        },
    
        dispose: function () {
            alert('bye ' + this.getName());
        },
    
        sendMail: function () {
            var emailAddress = this.getEmailAddress();
    
            if (emailAddress.indexOf('@') < 0) {
                emailAddress = emailAddress + '@example.com';
            }
            alert('Sending mail to ' + emailAddress + ' ...');
        },
    
        toString: function () {
            return this.getName() + ' (' + this.getEmailAddress() + ')';
        }
    }
    //注册类Demo.Person
    Demo.Person.registerClass('Demo.Person', null, Sys.IDisposable);
    
    //定义Employee类
    Demo.Employee = function (firstName, lastName, emailAddress, team, title) {
        Demo.Employee.initializeBase(this, [firstName, lastName, emailAddress]);
    
        this._team = team;
        this._title = title;
    }
    //Employee类的方法
    Demo.Employee.prototype = {
    
        getTeam: function () {
            return this._team;
        },
        setTeam: function (team) {
            this._team = team;
        },
    
        getTitle: function () {
            return this._title;
        },
        setTitle: function (title) {
            this._title = title;
        },
        toString: function () {
            return Demo.Employee.callBaseMethod(this, 'toString') + '\r\n' + this.getTitle() + '\r\n' + this.getTeam();
        }
    }
    //注册Demo.Employee类,并指定其继承自Demo.Person类
    Demo.Employee.registerClass('Demo.Employee', Demo.Person);

    调用的代码:

    var person = new Demo.Person('Jack', 'Smith', 'jack@hotmail.com');
    alert(person.getEmailAddress());
    
    var employee = new Demo.Employee('Jack', 'Smith', 'jack@hotmail.com', 'Web Dev', '');
    alert(employee.getTeam());

    使用接口

    //注册接口
    Demo.Trees.IFruitTree.registerInterface('Demo.Trees.IFruitTree');
    //使用接口
    //类Demo.Trees.FruitTree继承了Demo.Trees.Tree,并实现了接口Demo.Trees.IFruitTree
    Demo.Trees.FruitTree.registerClass('Demo.Trees.FruitTree', Demo.Trees.Tree, Demo.Trees.IFruitTree);

    使用枚举

    //注册命名空间
    Type.registerNamespace("Demo");
    //定义枚举类型
    Demo.Color = function () { };
    Demo.Color.prototype =
    {
        Red: 0xFF0000,
        Blue: 0x0000FF,
        Green: 0x00FF00,
        White: 0xFFFFFF
    }
    //注册枚举类型
    Demo.Color.registerEnum("Demo.Color");
    
    //用法
    var color = Demo.Color.Red;

    反射的用法

    反射是指在运行时检查程序的结构和组件的能力。实现反射的 API 是对 Type 类的扩展。通过这些方法,可以收集有关对象的信息,例如该对象继承自谁,它是否实现特定的接口,以及它是否是特定类的实例等。

    var g = new Demo.Trees.GreenApple();
    var gt = Demo.Trees.GreenApple;
    var a = new Array(
        Demo.Trees.Apple,
        Demo.Trees.Tree,
        Demo.Trees.Pine,
        Demo.Trees.IFruitTree,
        Sys.IContainer);
    
    function OnButton1Click() {
        for (var i = 0; i < a.length; i++) {
            //是否为某一类型的实例
            if (a[i].isInstanceOfType(g)) { 
                alert(gt.getName() + " is a " + a[i].getName() + ".");
            }
            else alert(gt.getName() + " is not a " + a[i].getName() + ".");
        }
    }
    
    function OnButton2Click() {
        for (var i = 0; i < a.length; i++) {
            //是否继承自某一类型
            if (gt.inheritsFrom(a[i])) {
                alert(gt.getName() + " inherits from " + a[i].getName() + ".");
            }
            else alert(gt.getName() + " does not inherit from " + a[i].getName() + ".");
        }
    }
    
    function OnButton3Click() {
        for (var i = 0; i < a.length; i++) {
            //判断类型是否为接口
            if (Type.isInterface(a[i])) {
                //判断对象是否实现了接口
                if (gt.implementsInterface(a[i])) {
                    alert(gt.getName() + " implements the " + a[i].getName() + " interface.");
                }
                else alert(gt.getName() + " does not implement the " + a[i].getName() + " interface.");
            }
            else alert(a[i].getName() + " is not an interface.");
        }
    }
  • 相关阅读:
    P2949 [USACO09OPEN]工作调度Work Scheduling
    P1279 字串距离 (动态规划)
    P2634 [国家集训队]聪聪可可
    点分治模板
    网站收集
    P1131 [ZJOI2007]时态同步
    P1446 [HNOI2008]Cards
    P1437 [HNOI2004]敲砖块
    蓝桥杯-k倍区间
    atom / vscode (配置c++环境流程)
  • 原文地址:https://www.cnblogs.com/youring2/p/2847681.html
Copyright © 2020-2023  润新知