尝试为Array创建包装类,实现事件侦听器。以前,我使用了Array
方法的静态列表,但现在我希望它是动态的,所以我试图遍历Array.prototype。在谷歌搜索了一下之后,我在这个网站上发现了一个说使用Object.getOwnPropertyNames的东西,它确实有用......有点儿。这是我的code。调试属性有效,但实际上没有。
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define([], factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory();
} else {
root.Stack = factory();
}
}(this || window || {}, function() {
var Stack = function(stack) {
if (!(this instanceof Stack)) {
var self = Object.create(Stack.prototype);
Stack.apply(self, arguments);
return self;
} else {
if (stack instanceof Array) {
if (arguments.length > 1) {
Array.prototype.concat.apply(this.stack = [], arguments);
} else {
this.stack = stack;
}
} else if (Object.prototype.toString.call(stack) === '[object Object]') {
this.stack = [];
if (arguments.length > 1) {
for (var i = 0; i < arguments.length; i++) {
for (var j in arguments[i]) {
if (arguments[i].hasOwnProperty(j)) {
this.stack.push(arguments[i][j]);
}
}
}
} else {
for (var key in stack) {
if (stack.hasOwnProperty(j)) {
this.stack.push(stack[key]);
}
}
}
} else {
Array.prototype.push.apply(this.stack = [], arguments);
}
Array.prototype.push.apply(this, this.stack);
this.length = this.stack.length;
}
};
Stack.prototype = {
events: {},
on: function(event, callback) {
this.events[event].push(callback.bind(this.stack));
return this;
},
trigger: function(event, args) {
this.events[event].forEach(function(callback) {
callback(args);
});
return this;
},
off: function(event, callback) {
this.events[event].splice(this.events[event].indexOf(callback), 1);
return this;
}
};
var proto = Object.getOwnPropertyNames(Array.prototype),
method;
for (method in proto) {
method = proto[method];
if (typeof Array.prototype[method] === 'function') {
Stack.prototype.events[method] = [];
Stack.prototype[method] = function() {
return this.trigger(method, Array.prototype[method].apply(this.stack, arguments));
}
}
}
return Stack;
}));
method
,在记录时,给出方法的名称,然后可以使用Array.prototype [method]访问函数本身,但以下示例不起作用并在我使用时使用列表。
Stack(1, 2, 3).on('push', function (length) {
console.log('Length: ' + length + '.');
}).push(4, 5, 6);
我没有正确访问原型方法吗?我如何动态地运行它?