Javascript:生成在窗口上下文中可调用和可扩展的自执行类
这里有一些初学者的问题,但我似乎找不到解决我问题的有效答案。我想编写一个自动执行的全局javascript类“foo”,它的方法可以从窗口上下文调用(比如Javascript:生成在窗口上下文中可调用和可扩展的自执行类,javascript,Javascript,这里有一些初学者的问题,但我似乎找不到解决我问题的有效答案。我想编写一个自动执行的全局javascript类“foo”,它的方法可以从窗口上下文调用(比如window.foo.bar()或只是在javascript控制台中foo.bar()),而不必实例化该类 同时,我希望能够用自定义函数扩展上述类,例如 foo.fn.baz=function(){} 我已经走了这么远了: (function (window) { var foo = function() { return this;
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更改代码
towindow.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.,谢谢你的回答。似乎我试图在脚本上强制使用它并不真正需要的结构,从而使事情变得极其复杂。单例解决方案完全满足我的需要。谢谢你澄清我的观点。