【发布时间】:2015-04-27 04:34:50
【问题描述】:
我正在创建一个 js 库,它直接处理来自集合对象的项目操作,如下所示。我想允许为每个项目添加动态用户定义的对象函数,并通过集合对象直接使用索引使这些函数可用(请参阅示例实现)。
var item = function (obj) {
this.foo = function () {
alert("foo" + this.name);
}
for (var i in obj) {
this[i] = obj[i]; //dynamic fields (overridable)
}
}
var collection = function (list) {
var self=this;
this.items = [];
if (list && list.length > 0) {
for (var i in list) {
var t = new item(list[i]); // create new item
for (var j in t) {
if (typeof (t[j]) === "function") {
this[j]=function(index,arg1,arg2,arg3){
self.items[index][j](arg1,arg2,arg3); //not working (unreliable)
console.log(j) //undefined
// problem is here j cannot be visible from function handler.
//I need to call dynamic j function within handler
}
}
this.items.push(t); //push each item into collection
}
}
}
}
var obj=new collection([
{
id:1,name:"apple",
bar:function(arg){
alert(arg+" "+this.name);
}
}
]);
obj.foo(0); //equivalent to obj.items[0].foo();
obj.bar(0,"parameter"); //equivalent to obj.items[0].bar("parameter");
如上面代码 sn-p 中的 cmets 所述,我无法从集合函数中动态调用项目的函数。 我怎样才能达到这个目的。请帮帮我。
【问题讨论】:
-
FUNCTION.name会得到函数名,是你想要的吗? -
谢谢,但分配给(动态)字段的函数是匿名的。我要检索的是字段名。
-
我为您的代码创建了一个 jsfiddle,它无需任何更改即可工作。 jsfiddle.net/avivshaked/o6g9k8s6
-
@user1147987,我在 fiddle 上尝试了你的代码,它运行良好,我没有得到你的问题,你能看看“jsfiddle.net/w8npva2b”吗?
-
是的,它适用于一件物品,但如果收藏中的物品不止一件,它就不起作用。
标签: javascript function oop