• JavaScript技巧


    JavaScript技巧篇:

    1》状态机

         var state = function () {
                    this.count = 0;
                    this.fun = null;
                    this.nowcount = 0;
    
                };      
                state.prototype = {
                    load: function (count,fun) {
                        this.count = count;
                        this.fun = fun;
                        this.nowcount=0;
                    },
                    trigger: function () {
                        this.nowcount++;
                        if (this.nowcount >= this.count){
                            this.fun();
                        }
                    }
                };
    
                //--------------
    function method1() { s.trigger(); } function method2() { s.trigger(); } var s = new state(); s.load(2, function () { console.log('执行完毕'); }); setTimeout(method1, 1000); setTimeout(method2, 1000);

      状态机一般用在多个异步任务的情况下,任务执行到某个阶段执行某个函数!

      场景:同时请求多个异步执行[并发异步or异步串行](ajax,nodejs的io),并处理结果集合,以上的写法最简单,但却不够优美,

      这是我发现的至今为止最好的一js异步流程文章: http://www.docin.com/p-687111809.html~

    2》setTimeout 的特殊应用  

    var hander=setTimeout(function () { },100);
    clearTimeout(hander);
    

      场景1》:按钮三次快速点击才触发事件   

         var num = 0;
            var hander = 0;
            function btnClick() {
                if (hander != 0){
                    clearTimeout(hander);
                    hander = 0;
                }
                num++;
                if (num >= 3) {
                    Run();
                    num = 0;
                    clearTimeout(hander);
                    hander = 0;
                }
                hander = setTimeout(function () {
                    num = 0;
                }, 300);
            }
            function Run() {
                console.log('Run');
            }
        <input type="button" onclick="btnClick()" value="快速点击三次触发" /> 

      场景2》:快速多次点击只触发最后一次

     	var hander = 0;
            function btnClick() {
                if (hander != 0) {
                    clearTimeout(hander);
                    hander = 0;
                }
                hander = setTimeout(function () {
                    Run();
                }, 300);
            }
            function Run() {
                console.log('Run');
            }
        <input type="button" onclick="btnClick()" value="快速点击只触发最后一次" />
    

     其他(长期更新)....

    JavaScript写法:

      《. & []》

         var obj = new Object();
            obj.add = function (a, b) {
                return a + b;
            }
            console.log(obj.add(1, 2));
    
            var obj2 = new Object();
            obj2['add'] = function (a, b) {
                return a + b;
            }
            console.log(obj2.add(1, 2));

      《prototype》 最常见

         var obj = function (name) {
                this.name = name;
            }
            obj.prototype.say = function () {
                console.log(this.name);
            }
            obj.prototype.add = function (a, b) {
                return a + n;
            }
            var o = new obj('fuck');
            o.say();
    
            var obj = function (age) {
                this.age = age;
    
            };
            obj.prototype = {
                add: function (a, b) {
                    return this.age;
                },
                say: function () {
                    console.log('@');
                }
            }
            var o = new obj(23333);
            console.log(o.add());

      《运行创建对象》 简单闭包

        var obj2 = function () {
                var _name = '123';
                function _add(a, b) {
                    return a + b+_name;
                }
                return {
                    add: _add,
                    name: _name
                };
            }();
            console.log(obj2.add(1,3));

      Object.create Object.defineProperty

            var obj = function () {
                this.add = function () {
                    console.log('add')
                }
            }
            var outo = new obj();
            var o = Object.create(outo, {
                sub: {
                    value: function () {
                        console.log('sub')
                    }
                }
            });
            o.add();
            o.sub(); 
      var obj = function () {
                this.add = function () {
                    console.log('add')
                }
            }
            var o = new obj();
            Object.defineProperty(o, {
                "sub": {
                    value: function () {
                        console.log('sub')
                    },
                    writeable: false
                }
            });
            o.sub();
    

      __proto__

         var obj = function () {};
            obj.prototype = {
                add: function () {
                    console.log('add');
                },
                sub: function () {
                    console.log('sub');
                }
            };
    
            var o = {};//new Object();
            o.__proto__ = obj.prototype;
    
            o.add();
            o.sub();
        var o = {};//new Object();
            o.__proto__ = {
                add: function () {
                    console.log('add');
                },
                sub: function () {
                    console.log('sub');
                }
            };
            o.__proto__.go = function () {
                console.log('go');
            }
    
            o.add();
            o.sub();
            o.go();
    

      call bind

       var obj = new Object();
            obj.name = 'myname';
            function add() {
                console.log(this.name+':add');
            }
            add.call(obj);
    
    
            var obj = new Object();
            obj.name = 'myname';
            function add() {
                console.log(this.name + ':add');
            }
            var newadd = add.bind(obj);
            newadd();
    

      

     写在最后:

      prototype》function的内置属性

      __proto__》任意对象的内置属性

      add.call(obj)》在obj对象域下执行add apply同是

      add.bind(obj)》给add绑定一个obj对象执行域,obj对象并不会得到add,bind返回一个绑定执行域obj的函数add

      类.add,为静态,不会被实例化

      类.prototype.add,是修改原型,可以实例化 prototype 等价 this

      对象.add 是为对象添加 add ,仅对象使用

      对象.__proto__,是对象的所有属性集,

      表达式:对象.__proto__= 某类.prototype 为原始属性完全继承,对象.__proto__=另一对象.__proto__ 为对象简单深层复制

      表达式:对象.__proto__.add 为对象添加add或修改add,同理:对象.__proto__.add()为执行

      同理:表达式:for (var i in o.__proto__) {console.log(o.__proto__[i])}为遍历对象属性

      表达式:for (var i in 类.prototype ) {}为遍历类属性

         

  • 相关阅读:
    socket
    RBAC
    CMOS和BIOS
    canvas和SVG
    兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面
    HTML标签marquee实现滚动效果
    百度判断手机终端并自动跳转uaredirect.js代码及使用实例
    JavaScript中常用的事件
    解决windows server 2008 r2 登录进入桌面只显示一片蓝色背景
    ng2自定义管道
  • 原文地址:https://www.cnblogs.com/luconsole/p/4287547.html
Copyright © 2020-2023  润新知