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

如果对象包装在匿名func中,如何在javascript中允许多个实例,javascript,Javascript,正如crockford和john resig所主张的,应该将对象包装在匿名函数中。但是,如果一个人需要有多个实例呢?当它被包装时,将只存在一个实例(singleton) 更新:我忘了说我说的当然是框架的根对象(不是jquery,而是我自己的),而不是任何对象的根对象。因为它是一个框架,所以实例的数量是未知的,由客户端决定 我猜99.99%的人只使用框架,不构建自己的框架,所以如果你不知道,不要试图回答你自己不理解的问题:)“正如crockford和john resig所主张的,应该将对象包装在匿

正如crockford和john resig所主张的,应该将对象包装在匿名函数中。但是,如果一个人需要有多个实例呢?当它被包装时,将只存在一个实例(singleton)


更新:我忘了说我说的当然是框架的根对象(不是jquery,而是我自己的),而不是任何对象的根对象。因为它是一个框架,所以实例的数量是未知的,由客户端决定

我猜99.99%的人只使用框架,不构建自己的框架,所以如果你不知道,不要试图回答你自己不理解的问题:)

“正如crockford和john resig所主张的,应该将对象包装在匿名函数中。”

是的,特别是为了避免对象泄漏到全局空间。。。但我不认为他们建议你在任何地方都这样做,你使用的对象

如果希望在全局空间中有多个对象,将如何命名它们?卡隆和卡托

相反,您可以使用一个名为MyGarage的全局文件,MyGarage可以包含CarOne和CarTwo?

2011-06-26(美国东部时间1:26P)您可能正在寻找框架的深层副本


由于您没有提供示例,下面是一个使用jQuery的示例。对于每个新的“实例”,您将向框架添加一个属性,该属性将保存它。或者,您可以只使用一个框架数组,继续将实例推送到堆栈上。无论哪种方式,都是一个变量来保存多个实例/副本

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'

原始答案


这是你想要的东西吗

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

作者评论
:我猜99.99%的人只是使用框架,并不构建自己的框架,所以如果你不知道,不要试图回答你自己不了解的问题:)


Response
:我猜99.99%的人不会遇到这样的情况,因为他们了解框架的用途,如果你需要一个框架的实例,你就有设计缺陷。此外,如果有人设计了一个www中还不存在的框架,那么他们应该能够理解如何实现自己的“实例”,而不必使用复杂的全局名称空间。

您正在寻找类似的东西吗

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

};
用法:

var car = new autos.Car(123, 'MDX');
car.drive();
car.stop();

这是一种从直接实例化的函数创建伪名称空间的方法(有多种方法):

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
实例,如下所示:

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

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

您可以提供一个示例吗?我想这里有一个示例,您正在谈论的是,jQuery的多个实例?是的,除了它不是jQuery,它是我自己的框架库。是的,我理解,这就是
类似的东西所暗示的
好吧,我忘了说我说的当然是一个框架的根对象,而不是任何对象。因为它是一个框架,实例的数量是未知的,由客户端决定。你不断地抛出术语框架,然后使用实例。你需要一个更好的例子。一个框架是用一个根对象实现的,那么你为什么要对比这两个呢?我对比这两个,因为框架不需要实例;实例应该在框架内。通过设计,一个框架意味着一个辅助实例的工具,通过拥有多个实例,你只会使用不必要的资源。再说一次,如果你有一种奇怪的情况与这个想法形成对比(我不是说你没有),你需要展示一个更好的例子。真的吗?然后你没有读John Resig,他说的是多个实例。你没有用匿名函数包装你的框架,这是我问题的重点。不,框架变量是一个包含各种框架实例的变量(例如a,b)。您需要以某种方式在全局范围内调用这些框架,就像使用
$
jQuery
调用该框架一样。说到John Resig,他并不是一切都是JavaScript的终结,毕竟他来自波士顿。autos并不是由匿名函数包装的。当包装好后,你就不能再做新的了,这就是我的观点:)@user310291:从你所说的一切来看,你似乎在试图进入全局空间中的闭包范围,而这在设计上是永远不会起作用的。拥有一个匿名函数的全部目的是将它与全局空间分开。你到底希望如何实例化一个匿名函数?那没有任何意义。我错过了什么?