我遇到了下面用 Node 编写的代码,我试图理解它。有一个方法 process
附加到原型(prototype)以及对象本身。有什么不同?我了解该方法用于为对象提供单例实例。但是希望进一步解释或引用其工作原理。
var singleton;
var MyObj = function(opts) {//code}
MyObj.prototype = {
process: function() {//code}
}
MyObj.process = function process() {
singleton.process();
}
MyObj.init = function init(opts) {
singleton = new MyObj(opts);
}
module.exports = MyObj;
最佳答案
我将解释每个代码块:
var singleton;
该变量在模块中声明但未导出。这意味着它是模块私有(private)的并且存在于闭包中。
var MyObj = function(opts) { /* code */ }
这是构造函数。
MyObj.prototype = {
process: function() {//code}
}
使用 MyObj
构造函数创建的每个实例都会被赋予一个 process
方法。
MyObj.process = function process() {
singleton.process();
}
该方法存在于原型(prototype)本身上。调用时,它会执行 singleton
对象的 process
方法。因为singleton
对象
对此模块私有(private),每次调用 MyObj.process
都会执行同一 singleton
对象的 .process
方法。
MyObj.init = function init(opts) {
singleton = new MyObj(opts);
}
init
方法用于创建 MyObj
原型(prototype)的实例。该实例被分配给singleton
对象。 singleton
对象是模块私有(private)的,因此每次调用 MyObj.init
都会操作同一个 singleton
实例,从而有效地覆盖之前存储在其中的对象。这可确保 singleton
对象始终是 MyObj
的实例。
module.exports = MyObj;
构造函数在这里导出。请注意,singleton
对象未导出。
总结
(new MyObj()).process()
和 MyObj.process()
执行相同的函数,因为它们使用相同的 singleton
实例。您可以阅读 NodeJS 中的单例 here和 here
关于javascript - Node 中具有原型(prototype)的单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136172/