【问题标题】:Chaining member variables with side-effect with the chain not ending in a function链接具有副作用的成员变量,链不以函数结尾
【发布时间】:2019-12-24 17:38:11
【问题描述】:

在 JavaScript chaijs 测试库中,可以像这样链接成员:

pm.expect (entry.NAME).to.be.a('string').that.is.not.empty;

这个问题不是关于测试库,而是关于库的内部技术。我知道它的工作原理是这样的:pm.expect 是一个函数,它返回一个至少包含 { to: { be: { a } } } 的对象,其中 a 是另一个至少返回 { that: { is: { not: { empty } } } } 的函数。

有趣的是empty 显然不是一个函数。如果是,我将不得不这样称呼它:that.is.not.empty()(注意括号)。所以链以一个不是函数的成员变量结束。

如何在 JavaScript 中使用该成员变量来产生副作用?你能告诉我一个最小的 JS sn-p,它允许我用不是函数调用的东西(比如 empty;)结束一个表达式,并且仍然像一个函数调用一样吗?

【问题讨论】:

    标签: javascript decorator-chaining


    【解决方案1】:
      function expect(value) {
          return {
             get empty() { return !value.length; },
          };
      }
    
     expect("test").empty // false
     expect("").empty // true
    

    这是通过getter 完成的,请查看ChaiJS sourcecode

    【讨论】:

      【解决方案2】:

      你能告诉我一个最小的 JS sn-p,它允许我用不是函数调用的东西(比如空;)结束表达式,并且仍然像函数调用一样工作吗?

      当然。一种方法是使用getter

      const person = (name) => ({
        get greet()   { return `Hello ${name}!`;   },
        get dismiss() { return `Goodbye ${name}!`; }
      });
      
      console.log( person("Tyler").greet );
      console.log( person("John").dismiss );

      【讨论】:

        猜你喜欢
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多