gpt4 book ai didi

javascript - 使用 RequireJS 在单例和原型(prototype)范围之间切换

转载 作者:行者123 更新时间:2023-11-30 17:36:03 25 4
gpt4 key购买 nike

Spring 有非常有用的选项,我定义了一个 bean,我定义了一个范围。如果是单例,则只创建一个实例。通过原型(prototype),每次需要一个bean 时,都会创建一个新实例。

RequireJS 默认提供单例,所以有了这样一个简单的模块:

单例.js

define([], function() {
console.log('Instance initialization')
var items = []
var singleton = {
getItems: function() {
return items
},
setItems: function(newItems) {
items = newItems
},
addItem: function(item) {
items.push(item)
}
};
return singleton;
})

和用法:

require(["showcase/modules/Singleton"], function(Singleton){
Singleton.addItem('item1')
console.log(Singleton.getItems())
})
require(["showcase/modules/Singleton"], function(Singleton){
Singleton.addItem('item2')
console.log(Singleton.getItems())
})

输出将是:

Instance initialization ["item1"] ["item1", "item2"]

是否可以这样定义和使用模块,如果我想使用原型(prototype)或单例范围,我可以在模块定义中切换?所以就我而言,在不改变用法的情况下,我会得到:

Instance initialization ["item1"] Instance initialization ["item2"]

我正在使用 Dojo 的 RequireJS,以防出现语法差异

最佳答案

嗯,首先的问题是,当你使用AMD加载器导入一个模块时,你实际上会得到一个实例,但是当你第二次导入同一个模块时,实际上返回的是同一个实例(问题1)。

要克服这个问题,您应该使用工厂设计模式来获取您的实例,并将您的单例对象转换为可以实例化的类(问题 2)。您的工厂可以有一个名为 getInstance() 的方法,它接受一个可以在单例/原型(prototype)之间切换的 boolean 参数。

因此,由于我刚刚解决的问题,如果不更改您的用法,您将无法执行此操作。我能想出的最佳解决方案(与工厂)是:

单例.js

define([], function() {
console.log('Instance initialization');

// Singleton class
var Singleton = function() {
this.items = [];
this.getItems = function() {
return this.items;
};
this.setItems = function(newItems) {
this.items = newItems;
};
this.addItem = function(item) {
this.items.push(item);
}
};

// Factory
var factory = {
singletonInstance: new Singleton(),
getInstance: function(/** Boolean */ isSingleton) {
if (isSingleton === true) {
return this.singletonInstance;
} else {
return new Singleton();
}
}
};
return factory;
});

用法(单例)

require(["app/Singleton"], function(singletonFactory){
var Singleton = singletonFactory.getInstance(true);
Singleton.addItem('item1');
console.log(Singleton.getItems());
});
require(["app/Singleton"], function(singletonFactory){
var Singleton = singletonFactory.getInstance(true);
Singleton.addItem('item2');
console.log(Singleton.getItems());
});

用法(多个实例)

require(["app/Singleton"], function(singletonFactory){
var Singleton = singletonFactory.getInstance(false);
Singleton.addItem('item3');
console.log(Singleton.getItems());
});
require(["app/Singleton"], function(singletonFactory){
var Singleton = singletonFactory.getInstance(false);
Singleton.addItem('item4');
console.log(Singleton.getItems());
});

如果您对完整示例感兴趣,请访问 Plunker .

最终你可以将工厂包装成一个插件,这样你就可以做类似的事情:

require([ "app/Object!singleton", "app/Object!prototype" ], function() {

});

但是我不知道 RequireJS 是否也支持这个(如果我理解得很好,它应该是两个 AMD 加载器的通用故事)。

关于javascript - 使用 RequireJS 在单例和原型(prototype)范围之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22043096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com