0

我刚刚了解了模块模式。我已经编写了一些足够复杂的代码,以至于我想测试一个功能。问题是,我不知道如何模拟一个值。接下来是coffeescript,但我会将生成的javascript放在下面,以便获得更多帮助。这是我的测试,它试图模拟一个名为 的字段state,但它总是打印“未定义”:

root = exports ? this
root.test3 = (->
  root.test2.state = "abc"
  root.test2.doSomething()

  return {}
)()

这里是 test2 ,出于这个问题的目的,可以将其视为生产代码:

root = exports ? this
root.test2 = (->
  state = undefined

  doSomething = -> alert state

  return {
    state: state
    doSomething: doSomething
  }
)()

这是我在其中运行的 html,但我认为这并不重要:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>TEST2</title>

    <script src="test2.js" type="text/javascript"></script>
    <script src="test3.js" type="text/javascript"></script>

    <style>
        canvas {
            border: 1px solid black;
        }
    </style>

</head>

<body>


<h1>This is a test</h1>

</body>
</html>

Javascript中的test2:

var root;

root = typeof exports !== "undefined" && exports !== null ? exports : this;

root.test2 = (function() {
  var doSomething, state;
  state = void 0;
  doSomething = function() {
    return alert(state);
  };
  return {
    state: state,
    doSomething: doSomething
  };
})();

Javascript中的test3:

var root;

root = typeof exports !== "undefined" && exports !== null ? exports : this;

root.test3 = (function() {
  root.test2.state = "abc";
  root.test2.doSomething();
  return {};
})();

正如我所说,运行此警报undefined。我希望它输出“abc”。我怎样才能做到这一点?

4

1 回答 1

1

在这种情况下,您想使用“this”,

doSomething = function() {
    return alert(this.state);
};

在您的代码中,“状态”是指未定义的变量(通过闭包)。然后,您返回一个包含新“状态”属性的对象。您不需要第一个“状态”变量,只需要返回对象中的属性。

doSomething 中的“this”指的是它所属的任何对象。在 test3 中,doSomething 指的是返回的对象,其 'state' 设置为 undefined。在 test3 中设置状态后,对象的“state”属性不再与 test2 中的私有变量“state”相同——它在 test3 中被覆盖。

本质上,您不需要模块模式即可获得所需的效果,有一种更简单的方法:

root.test2 = {
    state: void 0,
    doSomething: function() {
        return alert(this.state);
    }
};

http://jsfiddle.net/rMJs5/

更新:: 我忘记了咖啡部分:

root = exports ? this
root.test2 = (->
  doSomething = -> alert this.state
  return {
    state: undefined
    doSomething: doSomething
  }
)()

或者,简单地说:

root = exports ? this
root.test2 = {
    state: undefined
    doSomething: -> alert this.state
}
于 2013-07-02T02:25:17.283 回答