这是来自node.js中的node-webworker。代码按照宣传的方式工作,但我不明白如何。
在master.js
中创建了Web工作者(作为w
),它具有w.onmessage = function...
。
但是在定义了Web工作者的foo.js
中,已经存在onmessage = function...
。
我遗漏了一些基本的东西,但问题是:为什么master.js
w.onmessage
不会覆盖原来的foo.js
onmessage
?
var sys = require('sys');
var Worker = require('webworker');
var w = new Worker('foo.js');
w.onmessage = function(e) {
sys.debug('Received mesage: ' + sys.inspect(e));
w.terminate();
};
w.postMessage({ foo : 'bar' });
var sys = require('sys');
onmessage = function(e) {
postMessage({ test : 'this is a test' });
};
onclose = function() {
sys.debug('Worker shutting down.');
};
答案 0 :(得分:0)
如果您的模块包含如下代码:
func = function() {
console.log('function called');
};
并且需要这样:
var module=require('./module');
然后module.func
将是undefined
。那是因为func
被分配给模块的全局范围。当您致电require
时,您会获得对模块 exports
的引用,而不是模块的 globals 。因此,当你设置module.func
时,比如说:
module.func = function() {
console.log('was it overwritten?');
};
...然后模块的exports
确实会反映新函数,但它从未触及模块的全局变量。
答案 1 :(得分:0)
因为当您在对象实例中进行更改时,您不会更改其原型(类)(阅读有关js对象模型)。如果要更改父对象的行为,请键入以下内容:
w.prototype.onmessage = function() {/* ...your code... */};
JS对象模型允许您覆盖每个对象的方法来改变它的行为,但是从这个改变中获得安全的原型。习惯了。
加载模块时,它在隔离范围内运行,因此如果没有直接更改所需对象,则无法访问sys函数。这将有助于您了解nodejs的模块模型,尝试运行它:
<强> require.js 强>
module.exports = {};
<强> main.js 强>
var x = require('./require.js');
x.tell = true;
var y = require('./require.js');
y.tell = false;
console.log(require('./require.js'));