这里有一些初学者的问题,但我似乎无法找到解决问题的方法。我想写一个自我执行的全球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();
,那么我可以调用这些功能,但我无法扩展这个班了。
我该怎么做?我的代码是否接近正确的方式来做这样的事情?是否有可能同时获得两件事?
任何有想法或提示的人?一切都会很棒。
感谢
答案 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
。