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



一些初学者的问题,但我似乎找不到一个工作的答案,我的问题。我想写一个自我执行,全局javascript类'foo',其方法可以从窗口上下文调用(如window.foo.bar()或只是foo.bar()在javascript控制台),而不必实例化类。

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

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;更改为window.foo = new foo();,那么我可以调用函数,但我不能扩展类了。

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

有人有什么想法或提示吗?什么都可以。

谢谢

foo.bar is undefined

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

var f = new foo();
f.bar();

如果你想要一个单例(foo本身就是一个对象,你可以调用foo.bar()),你根本不需要原型:

window.foo = {
    bar: function(string) {
        console.log(string);
    }
};

…但是当您使用"类"这个词时,我猜您确实想使用foo创建多个实例,而不是直接使用foo,因此new foo()将是您想要的。


旁注:JavaScript中最重要的约定是,如果一个函数被期望通过new调用,它将以一个大写字母开头。所以Foo而不是foo

最新更新