js写一个链式调用的函数

clipboard.png

写一个print() 函数,能够通过如图上不同的调用,显示不同的结果。
谁知道怎么写的?!

阅读 4.4k
5 个回答
function Print() {
    var print = function () {
        return {
            Print: function () {
                console.log("aaaaa")
            }
        }
    }
    print.Print = function () {
        return function () {
            console.log("bbbbb")
        }
    }
    return print;
}
Print().Print()();
Print()().Print();
function Print () {
  function createAPrinter () {
    return {
      Print: function printA () {
        console.log('aaaaa');
      }
    }
  }

  createAPrinter.Print = function () {
    return function printB () {
      console.log('bbbbb');
    }
  }

  return createAPrinter;
}

要详细讲下吗?其实一步一步推并不难的:

首先我们声明这样两个函数:

function printB () {
  console.log('bbbbb');
}
function printA () {
  console.log('aaaaa');
}

看一看题目,你会发现:

Print().Print() === printB
Print()() === printA

于是我们往前推一步,再两个函数,他们分别返回 printB 和 printA:

function createPrintB () {
  return printB;
}
function createPrintA () {
  return printA;
}

看看上面我们发现的等式,你会发现:

Print().Print === createPrintB
Print() === createPrintA
// 你还会发现
createPrintA.Print === createPrintB

到这里你就可以写出:

function Print () {
  function createPrintA () {
    return function printA () {
      console.log('aaaaa');
    }
  }

  function createPrintB () {
    return function printB () {
      console.log('bbbbb');
    }
  }
  
  createPrintA.Print = createPrintB;

  return createPrintA;
}

然后整理一下就是我上面的答案了。

希望对你有帮助

var Print=new Proxy(function(){},{
        apply:function(target){
            target.index=~~target.index+1;
            if(target.index %3 ==0){
                console.log(String.fromCharCode(target.index/3+96).repeat(3));
            }
            return Print;
        }
    });
    Print.Print=Print;
    Print().Print()();
    Print()().Print();
function Print() {
  function a() {
    return {
      Print() {
        console.log('aaaaa')
      }
    }
  }
  a.Print = () => () => console.log('bbbbb')
  return a
}

一楼妙啊。
clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题