从数组实例中隐藏额外的方法
Hide extra methods from array instances
我创建了一个数组,其中包含所有变化方法的事件。如果你做。push。on('push')被触发。我通过向数组实例添加一个新的push来实现这一点。现在的问题是,如果您在console.log或比较测试中的数组,新方法也会显示出来。有办法隐藏这些新方法吗?
代码:
var oar = function (base) {
var arr = base || [];
var handlers = {};
arr.on = function (event, callback) {
if (typeof handlers[event] === 'undefined') {
handlers[event] = [];
}
handlers[event].push(callback);
};
var proxy = function (method) {
var args = Array.prototype.slice.call(arguments, 1);
var result = Array.prototype[method].apply(arr, args);
process.nextTick(function () {
if (typeof handlers[method] !== 'undefined') {
handlers[method].forEach(function (handler) {
handler(arr);
});
}
});
return result;
};
[ 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift' ].forEach(function (method) {
arr[method] = proxy.bind(null, method);
});
return arr;
};
module.exports = oar;
如果您console.log数组或例如使用should (a.should.eql(…))在测试中验证它,它会考虑所有代理方法加上on方法。
[
'one',
'two',
on: [Function],
pop: [Function],
push: [Function],
reverse: [Function],
shift: [Function],
sort: [Function],
splice: [Function],
unshift: [Function]
]
如果我理解正确的话,我可以代理原型代替,但然后数组的所有实例将有这些新方法。
您想要的是使用Object.defineProperty
设置这些属性,它将它们默认设置为不可枚举的:
Object.defineProperty(arr, method, {value: proxy.bind(null, method)});
相关文章:
- 有没有一种方法可以仅使用HTML/CSS来隐藏基于特定值的数据单元格
- 用HTML在不同屏幕上显示和隐藏内容的方法
- 有没有一种方法可以从隐藏的可见性(CSS,JS)中获得淡入效果
- 使用较少代码隐藏和显示选择菜单内容的更好方法是什么?javascript
- 什么'这是用javascript隐藏和显示表中所有行的最快方法
- 编程实践-使用helper方法隐藏对象
- 有没有一种方法可以为卸载的lazylod图像隐藏alt标签
- 隐藏具有特定类$.each、for等的元素的有效方法
- 使用ScriptManager.RegisterStartupScript从代码隐藏调用javascript方法
- 隐藏数千个
- 元素的最快方法
- Javascript 计时器只调用一次 Code 隐藏方法
- 引导程序是否有显示隐藏类的方法
- 组合用于隐藏或显示内容的方法
- (“NetworkError:401未经授权)从JavaScript调用代码隐藏方法
- crypto-js如何隐藏类方法
- 仅使用textbox方法和属性在confirm ok和cancel的代码隐藏中执行不同的代码
- 使用javascript创建自己的隐藏类方法
- 使用 .call/.apply 隐藏类方法
- Javascript:是否有任何后门方法来访问数组的真正隐藏/私有长度属性
- jQuery Mobile-无法使用常见的jQuery方法隐藏按钮