如果对象包含在匿名func中,如何在javascript中允许多个实例

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);}
   };

}());

现在NS是伪命名空间,您可以从中创建一个Person实例,如下所示:

1
2
var pete = NS.createPerson('Pete','male',23);
alert(pete.name); //=> Pete

NS函数中,您可以使用函数,对象,局部变量等创建一个完整的框架。在返回的对象中,您可以包含所需的所有公共方法,使其全部勾选。


你在找这样的东西吗?

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);

Author's Comment:我猜99.99%的人只是使用框架并且不构建自己的框架,所以如果你不知道不试图回答你不了解的东西:)

Response:我想99.99%的人自己构建,不会遇到这样的事情,因为他们理解框架的目的,如果你需要一个实例,你就有一个设计缺陷。另外,如果某人"装备精良"来设计一个www中尚不存在的框架,那么他们应该能够理解如何实现他们自己的"实例"而不会使全局命名空间卷积。


"正如crockford和john resig所倡导的那样,应该将对象包装在匿名函数中。"

是的,特别是为了避免将对象泄漏到全球空间......但我不认为他们建议在任何地方使用对象。

如果您想在全局空间中使用多个对象,您将如何命名它们? CarOne和CarTwo?

相反,你使用一个名为MyGarage的全球,MyGarage可以包含CarOne和CarTwo吗?