首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我们可以在运行时使用键控函数的对象定义类吗?

我们可以在运行时使用键控函数的对象定义类吗?
EN

Stack Overflow用户
提问于 2014-12-07 08:16:24
回答 1查看 30关注 0票数 0

我正在尝试创建一个模拟助手,它可以模拟一个类并返回特定方法名称的特定值:

代码语言:javascript
运行
复制
  methods_values =
    a : 1
    b : 2
    c : 3
  methods = {}
  for method, value of methods_values
    methods[method] = ->
      value
  console.log methods
  // Outputs "{ a: [Function], b: [Function], c: [Function] }"

  class MockClass
    methods
  mock_instance = new MockClass()
  console.log mock_instance
  // Outputs "{}"

  for method, value of methods_values
    console.log method
    // Outputs "a"

    console.log mock_instance[method]()
    // Gives error "TypeError: Object #<MockClass> has no method 'a'"

我可以从编译的代码中看出为什么这不起作用,但是我无法确定前进的道路。这是否可能通过coffeescript实现,或者编译方式是否会阻止我获得正确的范围?

解决方案:由于@Leonid的回答,下面的代码可以工作:

代码语言:javascript
运行
复制
  methods_values =
    a : 1
    b : 2
    c : 3
  mock_methods = (proto, _methods_values) ->
    for method, value of _methods_values
      do (_value = value) ->
        proto[method] = -> _value
    return
  class MockClass
    mock_methods @::, methods_values

  mock_instance = new MockClass()
  for method, value of methods_values
    console.log method
    console.log mock_instance[method]()

产出:

代码语言:javascript
运行
复制
a
1
b
2
c
3
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-07 11:10:36

要做到这一点,您应该将所有的methods混合到MockClass.prototype中。下面是一个这样做的例子:

代码语言:javascript
运行
复制
mixin = (proto, methods) ->
  for name, fn of methods
    proto[name] = fn
  return

class MockClass
  mixin @::, methods

或者在你的情况下

代码语言:javascript
运行
复制
mock_methods = (proto, methods_values) ->
  for method, value of methods_values
    do (value) -> proto[method] = -> value
  return

class MockClass
  mock_methods @::, methods_values
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27340907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档