[英]Node.js leaking for..in loops
我使用的是一个定制的对象处理库(对于考试,不能使用我不亲自编程的东西,即JS.class),这往往会破坏函数的范围。
文件base.js
/**
* Module internals
*/
function _add() {
var obj_out = arguments[0];
for (var i=1; i < arguments.length; i++) { var arg = arguments[i];
for(prop in arg) { obj_out[prop] = arg[prop]; }
};
return obj_out;
}
function _merge() {
var obj_out = {};
for (var i=1; i < arguments.length; i++) { var arg = arguments[i];
for(prop in arg) { obj_out[prop] = arg[prop]; }
};
return obj_out;
}
function _args(args) {
return Array.prototype.slice.call(args, 0);
}
function _filterProps(items, re) {
console.log("Items: ", items);
var obj_out = {};
console.log("Before: ", obj_out);
var keys = [];
for(var key in items) {
keys.push(key);
}
console.log("Keys: ", keys);
for (var i=0; i < keys.length; i++) { var key = keys[i];
if(!re.test(key)){
obj_out[key] = items[key];
console.log("Step: ", obj_out);
}
}
console.log("After: ", obj_out);
return obj_out;
}
/**
* Class declaration
* Usage:
{
$extends: <classe parente>
$include: [<modules>]
$new: <constructeur>
$static: <methodes statiques>
$methods: <methodes>
}
*/
exports.Class = function(items) {
var base = !items["$extends"] ? Object.prototype : items["$extends"].prototype;
var incs = !items["$include"]? [] : items["$include"];
var stat = !items["$static"] ? {} : items["$static"];
var meth = !items["$methods"] ? {} : items["$methods"];
var cons = !items["$new"] ? function(){} : items["$new"];
var left = _filterProps(items, /^\$/);
var cls = function() {
console.log("Constructor");
console.log(arguments);
cons.apply(this, _args(arguments));
};
cls = _add(cls, stat);
cls.prototype = base;
for (var i=0; i < incs.length; i++) {
_add(cls.prototype, incs[i]);
};
_add(cls.prototype, left);
_add(cls.prototype, meth);
return cls;
}
文件test.js
Base = require('./base');
var SomeClass = Base.Class({
$new: function() { console.log("new"); },
foo: function() { console.log("foo"); },
});
var OtherClass = Base.Class({
$new: function() { console.log("new"); },
bar: function() { console.log("bar"); }
});
console.log("SomeClass: ", SomeClass.prototype);
console.log("OtherClass: ", OtherClass.prototype);
“ node test.js”的输出
Items: { '$new': [Function], foo: [Function] }
Before: {}
Keys: [ '$new', 'foo' ]
Step: { foo: [Function] }
After: { foo: [Function] }
Items: { '$new': [Function], bar: [Function] }
Before: {}
Keys: [ '$new', 'bar', 'foo' ]
Step: { bar: [Function] }
Step: { bar: [Function], foo: [Function] }
After: { bar: [Function], foo: [Function] }
SomeClass: { foo: [Function], bar: [Function] }
OtherClass: { foo: [Function], bar: [Function] }
_filterProps函数趋向于在其“ for..in”循环中保留一些值,我不知道为什么。 而且我有些迷茫,因为javascript不是我的强项。
我的节点版本是Max OSX 10.6上的v0.5.8-pre
编辑
很好,感谢Zack Bloom和他看到隐藏的bug的能力,我发现我忘记复制“ Object.prototype”对象,因此它正在引用它。
谢谢JD
看起来您正在扩展Object.prototype,它将更改所有对象。
base = Object.prototype
cls.prototype = base
_add(cls.prototype, ...)
即使在循环语句中,您也必须声明使用的变量,否则它们将成为全局变量。 例如更改诸如
for(prop in arg) { obj_out[prop] = arg[prop]; }
像
for(var prop in arg) { obj_out[prop] = arg[prop]; }
编辑:实际上,您的问题是一个不同的问题,但是在您的代码中仍然是一个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.