Javascript向后感知链接没有括号

时间:2013-06-28 18:00:12

标签: javascript jasmine getter chaining brackets

今天我想通过与Jasmine类似的方式进行链接:http://pivotal.github.io/jasmine/

Jasmine具有非常流畅的编写测试条件的风格,例如:

expect(result).not.toBe(85);

在我的测试中,我只是想添加一个and作为一些糖涂层,没有做任何事情:

createRegion('test').and.append()

所以这很简单(我知道以下在IE8<中工作过了):

Layout.prototype.__defineGetter__('and', function() {
    return this;
});

但这让我对茉莉花的感兴趣:

  • 当我无法找到defineProperty(IE8<)或__defineGetter__
  • 的任何实例时,执行无括号链接
  • 无法找到定义not
  • 的位置
  • 试图想象在not之后链接的方法是如何知道它的 - 我假设变量在reverse = true方法中设置为not,所以进行方法知道要反转它& #39;结果?

你将如何实施这种行为,或者你知道茉莉是如何做到的?

2 个答案:

答案 0 :(得分:1)

这是我想出来的一种方法,但如果你有很多方法,你会想要使用getter而不是重复:

function expect(ob){
  var resp={};

  function not(fn){return function(){return !fn.apply(resp, arguments)}; }

  resp.toBe=function(val){;
      return val==ob; 
  };


  var n=resp.not=function(){};

  for(var i in resp){
     var v=resp[i];
     if(v.call){ n[i]=not(v); }
  }

  return resp;
}

// try it out on a number:
var x=123;

expect(x).not.toBe(123); // false
expect(x).not.toBe(321); // true
expect(x).toBe(123);     // true

请注意这是一个高度简化的演示;我不保证它是一个伟大的表演者,我不知道茉莉是如何实际工作的,但是考虑到约束,你做了什么。 我觉得它很整洁,但我还是更喜欢defineProperty。

答案 1 :(得分:1)

我看了一下源代码,并期望这个实现:

jasmine.Spec.prototype.expect = function(actual) {
  var positive = new (this.getMatchersClass_())(this.env, actual, this);
  positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
  return positive;
};

因此,属性not是同一个类的实现,接收这个额外的参数来反转输出:

jasmine.Matchers = function(env, actual, spec, opt_isNot) {
  this.env = env;
  this.actual = actual;
  this.spec = spec;
  this.isNot = opt_isNot || false; // reverse option set
  this.reportWasCalled_ = false;
};

最后,在jasmine.Matchers.matcherFn_中,它使用它来反转结果:

if (this.isNot) {
    result = !result;
}