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

时间:2014-07-24 10:11:39

标签: javascript

这里有一些初学者的问题,但我似乎无法找到解决问题的方法。我想写一个自我执行的全球javascript类' foo'其方法可以从窗口上下文中调用(如{javascript控制台中的window.foo.bar()或只是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;更改为window.foo = new foo();,那么我可以调用这些功能,但我无法扩展这个班了。

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

任何有想法或提示的人?一切都会很棒。

感谢

1 个答案:

答案 0 :(得分:1)

  

foo.bar未定义

右。您已将方法放在函数的prototype属性上。 foo.prototype引用的对象将被分配给您通过new运算符创建的实例作为其基础原型。所以:

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

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

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

...但是当你使用“class”这个词时,我的猜测是你确实想要使用foo创建多个实例,而不是使用foo直接,所以new foo()就是你想要的。


旁注:JavaScript中的压倒性惯例是,如果期望通过new调用函数,则它以大写字母开头。所以Foo而不是foo