js链式调用原理


将执行函数放入数组队列,使用next() 执行,将调用函数赋值给构造函数的原型,可以进行连续链式调用,必要:执行功能函数需要返回this

     let index = 0;
        let stack = [];

        function next() {
            let fn = stack[index];
            index++;
            if (typeof fn === 'function') {
                fn();
            }
        }

        function Man(name) {
            stack.push(function () {
                console.log("Hi! This is " + name);
                next();
            })
        }
        var Person = function (name) {
            return new Man(name)
        }
        Man.prototype.sleep = function (time) {
            stack.push(function () {
                setTimeout(function () {
                    console.log("Wake up after " + time)
                    next()
                }, time * 1000)
            })
            return this;
        }
        Man.prototype.eat = function (food) {
            stack.push(function () {
                console.log('Eat ' + food)
                next();
            })
            return this;
        }
        Man.prototype.sleepFirst = function (time) {
            stack.unshift(function () {
                setTimeout(function () {
                    console.log('wake up after ' + time)
                    next()
                }, time * 1000)
            })
            return this;
        }
        // Person('Li')
        /* 输出:
        Hi! This is Hank!
        */
        // Person('Dan').sleep(3).eat('dinner')
        /* 输出:
        Hi! This is Hank!
        // 等待10秒..
        Wake up after 10
        Eat dinner~
        */
        // Person('Jerry').eat('dinner~').eat('supper~')
        /* 输出:
        Hi This is Hank!
        Eat dinner~
        Eat supper~
        */
        Person('Smith').sleepFirst(2).eat('supper')
        /* 等待5秒,输出
        Wake up after 5
        Hi This is Hank!
        Eat supper
        */
        next()

备注:次代码段摘抄网上经典面试题


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM