Javascript:生成在窗口上下文中可调用和可扩展的自执行类

Javascript:生成在窗口上下文中可调用和可扩展的自执行类,javascript,Javascript,这里有一些初学者的问题,但我似乎找不到解决我问题的有效答案。我想编写一个自动执行的全局javascript类“foo”,它的方法可以从窗口上下文调用(比如window.foo.bar()或只是在javascript控制台中foo.bar()),而不必实例化该类 同时,我希望能够用自定义函数扩展上述类,例如 foo.fn.baz=function(){} 我已经走了这么远了: (function (window) { var foo = function() { return this;

这里有一些初学者的问题,但我似乎找不到解决我问题的有效答案。我想编写一个自动执行的全局javascript类“foo”,它的方法可以从窗口上下文调用(比如
window.foo.bar()
或只是在javascript控制台中
foo.bar()
),而不必实例化该类

同时,我希望能够用自定义函数扩展上述类,例如

foo.fn.baz=function(){}

我已经走了这么远了:

(function (window) {
var foo = function() {
    return this;
};
foo.fn = foo.prototype = {
    bar: function (string) {
        console.log(string);
    }
};
window.foo = foo;
})(window);
当我执行这个javascript时,js控制台现在知道了类foo,我可以通过
foo.fn.baz=function(){}
扩展它的函数,但是我不能调用这些函数:
foo.bar
是未定义的

如果我从
window.foo=foo更改代码
to
window.foo=new foo(),然后我可以调用函数,但我不能再扩展该类了

我该怎么做?我的代码是否接近正确的方式来做这样的事情?甚至有可能同时得到这两样东西吗

有人有想法或暗示吗?什么都好

谢谢

foo.bar
未定义

对。您已将这些方法放在函数的
prototype
属性上。
foo.prototype
引用的对象将被分配给通过
new
操作符创建的实例,作为它们的基础原型。因此:

var f = new foo();
f.bar();
如果您想要一个单例(
foo
本身就是one对象,您可以调用
foo.bar()
),您根本不需要原型:

window.foo = {
    bar: function(string) {
        console.log(string);
    }
};
…但是当您使用“类”这个词时,我的猜测是您确实希望使用
foo
创建多个实例,而不是直接使用
foo
,因此
new foo()
将是您想要的



旁注:JavaScript中压倒性的惯例是,如果一个函数预期通过
new
调用,它将以大写字母开头。因此,与其说是
Foo
,不如说是
Foo

嘿,T.J.,谢谢你的回答。似乎我试图在脚本上强制使用它并不真正需要的结构,从而使事情变得极其复杂。单例解决方案完全满足我的需要。谢谢你澄清我的观点。