0

这可以用更好的形式重写吗?

function F() { return F.f(); } //wrapping :(
F.f = function() { /* code1 */ }
F.g = function() { /* code2 */ }

F.f = some_other_function
F.g() //this still works :D

我永远不会创建 F 的任何实例。我只是将它用作一种命名空间。
我尝试执行以下操作,但 Fg 没有得到保留(我可以理解原因,但我想要一个很好的解决方法,能够更改 F 的代码和行为,但不能更改 Fg 之类的绑定):

function F() { /* code1 */ } //no wrapping :D, no need for F.f
F.g = function() { /* code2 */ }

F = some_other_function
F.g() //this points to nowhere now :(

编辑:我不想再使用 Ff 作为code1.

EDIT2:第一段代码是有效的 JS 并且具有我想要的行为。问题是我不喜欢我必须使用 Ff 。我想像第二个代码那样做,但仍然有 Fg 工作。
在运行时的某个时刻,我想更改code1并保持其他所有内容不变。

4

2 回答 2

3
var F = {
    f: function() {
        /* code1 */
    },
    g: function() {
        /* code2 */
    }
 };

F.f = function() { /* redefine F.f() */ }
// or
delete F.f;

F.g(); // still works

-

更新了问题澄清的答案

这是实现此目的的一种方法,尽管整个想法有点偏离。不知道为什么你会想要这种模式。

function generate() {
    var f = function() {
        /* code1 */
    };

    var ret_val = function() {
        f();
    };

    ret_val.g = function() {
        /* code2 */
    };

    ret_val.setBehaviour = function(new_func) {
        f = new_func;
    };
}

F = generate();

F(); /* code1 */
F.g(); /* code2 */

F.setBehaviour(function() { /* redefine F() */ });
F.g(); /* code2 still works */

F(); /* new behaviour */
于 2013-02-15T20:10:58.843 回答
0

关于什么:

var F = (function() {
  console.log("Something..");

  return function() {
    function g() {
      console.log("I'm G!");
    }
  };
})();

F.g();

现在你可以初始化一些东西(看起来就像你想要的那样)并保留 Fg

于 2013-02-15T20:21:48.800 回答