Javascript 从数组实例隐藏额外的方法
我为所有变异方法创建了一个带有事件的数组。所以如果你做了一个动作,一个动作(‘推’)就会被触发。为此,我向数组实例添加了一个新的推送。现在的问题是,如果您在测试中使用console.log或比较数组,那么新方法也会出现。有没有办法隐藏这些新方法 守则:Javascript 从数组实例隐藏额外的方法,javascript,Javascript,我为所有变异方法创建了一个带有事件的数组。所以如果你做了一个动作,一个动作(‘推’)就会被触发。为此,我向数组实例添加了一个新的推送。现在的问题是,如果您在测试中使用console.log或比较数组,那么新方法也会出现。有没有办法隐藏这些新方法 守则: var oar = function (base) { var arr = base || []; var handlers = {}; arr.on = function (event, callback) {
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]
]
如果我理解正确,我可以代理原型,但所有array实例都将使用这些新方法。您需要的是使用设置这些属性,默认情况下,这些属性设置为不可枚举:
Object.defineProperty(arr, method, {value: proxy.bind(null, method)});
您需要使用设置这些属性,默认情况下,这些属性设置为不可枚举:
Object.defineProperty(arr, method, {value: proxy.bind(null, method)});
enumerable
默认为false
。enumerable
默认为false
。