Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找在CoffeeScript中调用函数调用的类_Javascript_Class_Coffeescript - Fatal编程技术网

Javascript 查找在CoffeeScript中调用函数调用的类

Javascript 查找在CoffeeScript中调用函数调用的类,javascript,class,coffeescript,Javascript,Class,Coffeescript,我有两个类和一个全局函数。在全局函数中,我想确定哪个类调用它。下面是coffeescript中的代码 window.pet = ()-> alert "I was called #{by}" class Cat constructor: (@name) -> pet() class Dog constructor: (@name) -> pet() 这可能吗?简短的回答:不要 这个问题很可能是重复的。但我想指出的是,如果你需要用这种技巧来解决一

我有两个类和一个全局函数。在全局函数中,我想确定哪个类调用它。下面是coffeescript中的代码

window.pet = ()->
  alert "I was called #{by}"

class Cat
  constructor: (@name) ->
    pet()

class Dog
  constructor: (@name) ->
    pet()
这可能吗?

简短的回答:不要

这个问题很可能是重复的。但我想指出的是,如果你需要用这种技巧来解决一个问题,你可能会用这样的技巧来引入另一个问题。如果一个函数的行为需要依赖于某个东西(比如从哪里调用它),那么将其显式化,并为该依赖关系使用一个参数;这是每个人都很容易理解的模式

pet = (pet) ->
  alert "I was called by #{pet.name} the #{pet.constructor.name}" 

class Cat
  constructor: (@name) ->
    pet @

new Cat 'Felix' # Output: "I was called by Felix the Cat"

话虽如此,你也不应该用这个。但是您可以通过访问宠物的
构造函数
属性来安全地访问宠物的“类”(即其构造函数函数),如示例所示。

arguments.callee.caller.name就是您要查找的。下面的示例应该可以做到这一点

pet = ->
    callerName = arguments.callee.caller.name
    console.log "called by #{callerName}"

class Cat
  constructor: (@name) ->
    pet()

class Dog
  constructor: (@name) ->
    pet()

c = new Cat()
d = new Dog()

@user1737909简短回答:是,函数可能重复。toString甚至不是标准配置。旧的SpiderMonkey甚至没有。@yckart:这里不需要它,因为CoffeeScript构造函数是命名函数,并且(非标准的)
.name
属性在这里有效。但是请注意,在使用严格模式时,
参数。被调用方