将javascript对象作为函数调用

时间:2015-05-03 16:58:10

标签: javascript

Jest testing framework中,有一个jest.genMockFn()函数可以创建对象,可以将其作为函数调用并同时访问它的属性。

var mockFn = jest.genMockFn()
mockFn('Hello world!')
mockFn('The world is yours.')
console.log(mockFn.mock.calls) // [["Hello world!"], ["The world is yours."]]

当我转储mockFn时,我得到:

{ [Function]
  _isMockFunction: true,
  mock: 
   { calls: [ [Object], [Object] ],
     instances: [ [Object], [Object] ] },
  mockClear: [Function],
  mockReturnValueOnce: [Function],
  mockReturnValue: [Function],
  mockImpl: [Function],
  mockImplementation: [Function],
  mockReturnThis: [Function],
  _getMockImplementation: [Function] }

我无法弄清楚他们是如何实现这一目标的。有任何想法吗?你能提供类似功能的代码吗?谢谢。

2 个答案:

答案 0 :(得分:2)

函数的定义是

  

4.3.24 function

     

Object类型的成员,它是标准内置的实例   Function构造函数,可以作为子例程调用

因此拥有一个可以调用的对象并不奇怪。所有功能都是这样的。

具体来说,这是使用[[Call]]完成的,internal property仅为某些对象定义。

  

执行与对象关联的代码。通过函数调用调用   表达。 [...]实现此内部方法的对象是   可调用

答案 1 :(得分:1)

此代码可能允许您定义具有属性

的函数
?- replaceP(3,three,[1,2,3],Xs).
Xs = [1,2,three] ;                 % OK: correct, like before
false

?- replaceP(A,B,[1,2,3],Xs).       % OK: four solutions, not just one
Xs = [B,2,3], A = 1 ;         
Xs = [1,B,3], A = 2 ;
Xs = [1,2,B], A = 3 ;
Xs = [1,2,3], dif(A,1),dif(A,2),dif(A,3) ;
false

?- replaceP(A,B,[1,2,3],Xs), A=3.  % OK (succeeds now)
Xs = [1,2,B], A = 3 ;                 
false
?- A=3, replaceP(A,B,[1,2,3],Xs).  % OK (same as before)
Xs = [1,2,B], A = 3 ;
false