Javascript 区分方法和属性

Javascript 区分方法和属性,javascript,testing,jasmine,eslint,static-code-analysis,Javascript,Testing,Jasmine,Eslint,Static Code Analysis,问题: 我目前正在改进eslint插件jasmine包的性能,试图在未调用匹配器时处理另一个无效的jasmineexpect()用法: expect(true).toBeDefined; 有效用法: expect(true).toBeDefined(); 我已经非常接近了-我可以确定expect()上有一个成员表达式: 但是在有效和无效情况下,node.property都属于标识符类型: Node { type: 'Identifier', start: 13, end: 24,

问题:

我目前正在改进
eslint插件jasmine
包的性能,试图在未调用匹配器时处理另一个无效的jasmine
expect()
用法:

expect(true).toBeDefined;
有效用法:

expect(true).toBeDefined();
我已经非常接近了-我可以确定
expect()
上有一个成员表达式:

但是在有效和无效情况下,
node.property
都属于
标识符类型:

Node {
  type: 'Identifier',
  start: 13,
  end: 24,
  loc: 
   SourceLocation {
     start: Position { line: 1, column: 13 },
     end: Position { line: 1, column: 24 } },
  range: [ 13, 24 ],
  name: 'toBeDefined' }
没有任何明显的迹象表明这是一个属性或方法

问题:

如何确定属性是否可在
ESLint
中调用?

expect(true)。toBeDefined
解析为
MemberExpression
节点,但
expect(true)。toBeDefined()
解析为
CallExpression
。我不是100%确定为什么会发生这种情况,但在第二种情况下,它似乎认为在打开括号之前的整个语句都是一个单独的
调用表达式
,我希望会有两个单独的
调用表达式
,但情况似乎并非如此


因此,您可以做的是收听
CallExpression
,并检查被调用者是否是名为
expect
Identifier
。然后检查它的祖父母是
MemberExpression
还是另一个
CallExpression

有趣,感谢您的关注!实际上,我必须转到父级的父级并检查类型。
node.parent.parent.type
将是
CallExpression
,如果这是方法调用,
ExpressionStatement
如果是属性。。这是您的意思吗?请注意,在这两种情况下,
node.parent.type
仍然是
MemberExpression
。()是的,您必须转到祖父母节点。很抱歉。好的,这是有效的,包括测试和发送公关。谢谢。
Node {
  type: 'Identifier',
  start: 13,
  end: 24,
  loc: 
   SourceLocation {
     start: Position { line: 1, column: 13 },
     end: Position { line: 1, column: 24 } },
  range: [ 13, 24 ],
  name: 'toBeDefined' }