簡體   English   中英

如果對象包含在匿名func中,如何在javascript中允許多個實例

[英]How to allow multiple instances in javascript if object wrapped in anonymous func

正如crockford和john resig所主張的那樣,應該在匿名函數中包裝對象。 但是,如果需要多個實例呢? 當它被包裝時,只存在一個實例(單例)。

更新:我忘了說我當然在討論框架的根對象(不是jquery而是我自己的),而不是任何對象。 由於它是一個框架,因此客戶端不知道並決定實例的數量。

我想99.99%的人只是使用框架並且不構建自己的框架,所以如果你不知道不試圖回答你不了解的東西:)

這是[一個簡單的例子]從直接實例化函數創建偽命名空間(有更多方法)的方法:

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函數中,您可以使用函數,對象,局部變量等創建一個完整的框架。在返回的對象中,您可以包含所需的所有公共方法,使其全部勾選。

“正如crockford和john resig所倡導的那樣,應該將對象包裝在匿名函數中。”

是的,特別是為了避免將對象泄漏到全球空間......但我不認為他們建議在任何地方使用對象。

如果您想在全局空間中使用多個對象,您將如何命名它們? CarOne和CarTwo?

相反,你使用一個名為MyGarage的全球,MyGarage可以包含CarOne和CarTwo嗎?

2011-06-26(1:26P EST)您可能正在尋找框架的深層副本


由於您還沒有提供示例,因此這里有一個使用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);

Author's Comment我想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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM