在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] }
我无法弄清楚他们是如何实现这一目标的。有任何想法吗?你能提供类似功能的代码吗?谢谢。
答案 0 :(得分:2)
函数的定义是
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