zoukankan      html  css  js  c++  java
  • js链式编程

    1.先举一个小例子,什么是链式编程

    <script type="text/javascript" charset="utf-8">
                // 1.简单的函数链式调用
                
                function Dog() {
                    this.run = function(){
                        alert('dog is run');
                        return this;
                    };
                    
                    this.eat = function() {
                        alert('dog is eat');
                        return this;
                    };
                    
                    this.sleep = function() {
                        alert('dog is sleep');
                        return this;
                    };
                }
                
                var d1 = new Dog();
                d1.run();
                d1.eat();
                d1.sleep();
                
                d1.run().eat().sleep();
                
            </script>

    2.模拟jquery底层代码实现

    <input id = "input" type = "button" value="click me"/>
            
            <script type="text/javascript" charset="utf-8">
                
                // 模拟jquery底层链式编程
                
                // 块级作用域
                /**
                (function(){
                    // 特点一,程序启动即执行
                    alert('i am running');
                    // 特点二,内部的成员变量,外部无法访问。除了不加var修饰的变量
                    
                })();
                */
                
                (function(window, undifined){
                    // $ 最常用的符号 返回给外界
                    // 大型程序开发,一般使用'_'作为私有的对象,这是一个编程规范
                    function _$(arguments){
                        // 实现代码..。
                        // 正则表达式匹配ID 选择器
                        var idSelector = /#w+/;
                        // 定义一个内置属性来接收得到元素
                        this.dom;
                        // 如果匹配成功接收DOM元素
                        if(idSelector.test(arguments[0])) {
                            this.dom = document.getElementById(arguments[0].substring(1));
                            
                        } else {
                            throw new Error('arguments is error');
                        }
                    }
                    
                    // 在Function上扩展一个可以实现链式编程的方法。
                    Function.prototype.method = function(methodName, fn){
                        this.prototype[methodName] = fn;
                        // 链式编程的关键
                        return this;
                    };
                    
                    // 在_$的原型对象上加一些公共的方法。
                    _$.prototype = {
                        constructor : _$,
                        addEvent : function(type, fn){
                            // 给得到的元素注册时间
                            // FireFox
                            if(window.addEventListener) {
                                this.dom.addEventListener(type, fn);
                            }
                            // IE 
                            else if (window.attachEvent) {
                                this.dom.attachEvent('on' + type, fn);
                            }
                            
                            return this;
                        },
                        setStyle : function(prop, val){
                            this.dom.style[prop] = val;
                            return this;
                        }
                    };
                    
                    // window上 先注册一个全局变量  与外界产生关系
                    window.$ = _$;
                    
                    // 写一个准备的方法
                    _$.onReady = function(fn) {
                        // 1.实例化出来_$对象 真正的注册到window上
                        window.$ = function() {
                            return new _$(arguments);
                        };
                        // 2.执行传入进来的代码
                        fn();
                        // 3.实现链式编程
                        _$.method('addEvent', function(){}).method('setStyle', function(){});
                    };
                    
                    
                })(window);// 程序的入口,window传入作用域中
                
                // test
                $onReady(function() {
                    var input = $('#inp');
                    input.addEvent('click', function(){
                        alert('我被点击了!');
                    }).setStyle('backgroundColor', 'red');
                });
            </script>
  • 相关阅读:
    函数参数
    文件操作
    is,数据类型补充,set,深浅拷贝
    is,==区别,编码转换
    列表,元祖,range
    字典,解构
    编码,基础数据类型 int str bool,for循环
    while循环,格式化输出,运算符
    java7中使用透明时与输入法冲突
    TC SRM 597 DEV2
  • 原文地址:https://www.cnblogs.com/yangfanasp/p/7112790.html
Copyright © 2011-2022 走看看