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 ) {}为遍历类属性

     

原文地址:https://www.cnblogs.com/luconsole/p/4287547.html