How to allow multiple instances in javascript if object wrapped in anonymous func
正如crockford和john resig所主张的那样,应该在匿名函数中包装对象。 但是,如果需要多个实例呢? 当它被包装时,只存在一个实例(单例)。
更新:我忘了说我当然在讨论框架的根对象(不是jquery而是我自己的),而不是任何对象。 由于它是一个框架,因此客户端不知道并决定实例的数量。
我想99.99%的人只是使用框架并且不构建自己的框架,所以如果你不知道不试图回答你不了解的东西:)
这是[一个简单的例子]从直接实例化函数创建伪命名空间(有更多方法)的方法:
1 2 3 4 5 6 7 8 9 10 11 12 | var NS = (function(){ function Person(name,gender,age){ this.name = name || ''; this.gender = gender || ''; this.age = age || 0; } return { createPerson: function(n,g,a) {return new Person(n,g,a);} }; }()); |
现在
1 2 | var pete = NS.createPerson('Pete','male',23); alert(pete.name); //=> Pete |
在
你在找这样的东西吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var autos = { Car: function (id, model) { this.id = id; this.model = model; this.isMoving = false; this.drive = function drive() { this.isMoving = true; }; this.stop = function stop() { this.isMoving = false; }; } }; |
用法:
1 2 3 | var car = new autos.Car(123, 'MDX'); car.drive(); car.stop(); |
2011-06-26(1:26P EST)您可能正在寻找框架的深层副本
由于您还没有提供示例,因此这里有一个使用jQuery。对于每个新的"实例",您将向框架添加一个属性,这将保留它。或者您可以使用框架数组并继续将实例推送到堆栈。无论哪种方式,它都是一个变量来保存多个实例/副本。
1 2 3 4 5 6 7 8 9 10 | var frameworks = {}; frameworks.a = jQuery.extend(true, {}, jQuery); frameworks.b = jQuery.extend(true, {}, jQuery); (function($){$.fn.foo = function(arg){var foo=arg;}})(frameworks.a); console.log(frameworks.a.fn.foo.toString()); // uses 'arg' (function($){$.fn.foo = function(bar){var foo=bar;}})(frameworks.b); console.log((frameworks.a).fn.foo.toString()); // still uses 'arg' |
原始答案
这是你要追求的东西吗?
1 2 3 4 5 6 7 | var frameworks = {}; frameworks.base = function(i){var foo = i; return foo;}; frameworks.a = (frameworks.base)('a'); frameworks.b = (frameworks.base)('b'); document.write(frameworks.a); document.write(frameworks.b); |
"正如crockford和john resig所倡导的那样,应该将对象包装在匿名函数中。"
是的,特别是为了避免将对象泄漏到全球空间......但我不认为他们建议在任何地方使用对象。
如果您想在全局空间中使用多个对象,您将如何命名它们? CarOne和CarTwo?
相反,你使用一个名为MyGarage的全球,MyGarage可以包含CarOne和CarTwo吗?