[英]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.