【问题标题】:Calling arbitrary methods on instances inside of arrays using Array object in JavaScript使用 JavaScript 中的 Array 对象对数组内的实例调用任意方法
【发布时间】:2015-08-20 05:25:22
【问题描述】:

所以,假设我有这两个功能:

var foo = function() {
    this.message = "fooBar";
    this.fooBar = function() {
        console.log(this.message);
    };
};

var goo = function() {
    this.message = "gooBar";
    this.gooBar = function() {
        console.log(this.message);
    };
};

那么,假设我有这两个数组:

var Foos = [];
var Goos = [];

在程序的某个地方,我将相应函数的新实例推送到数组中(新的 foo 到 Foos 中,新的 goo 到 Goos 中)。现在,我想调用这些方法。所以,我可以为 Foos 这样做:

for(var i = 0; i < Foos.length; i ++) {
    Foos[i].fooBar();
}

然后是 Goos:

for(var i = 0; i < Goos.length; i ++) {
    Goos[i].gooBar();
}

当我有很多函数(我为我的程序做的)时,这样做会有点乏味。而且我的程序还提供了不止一种方法的功能。但有些功能只有一个。还有人有五个。所以,我想,为什么不使用Array 对象,就像这样:

Array.prototype.apply = function() {
    for(var i = 0; i < this.length; i ++) {
        this[i].CALL_METHODS();
    }
};

然后我可以将所有数组存储在一个数组中,并对该数组中的每个元素调用apply。但是,.CALL_METHODS() 不是一种实际的方法(当然)。那么,有没有什么方法可以做到这一点,调用实例的所有方法,不管方法的数量和名称是多少?

提前致谢!

【问题讨论】:

    标签: javascript arrays function class methods


    【解决方案1】:

    我确定在 javascript 中必须有实际的方法来执行此操作... 一个问题,你为什么要像这样调用在 javascript 对象中声明的任何方法?必须有一些设计模式可用于您的问题,但需要搜索... 阅读时刚开始输入一些代码:) 所以这里只是尝试以我能想到的任何可能的方式调用所有函数(可能是非常糟糕的方式):(

    var foo = function() {
        this.message = "fooBar";
        this.fooBar = function() {
            alert('im from foobar');
        };
        this.fooBar1 = function() {
            alert('im from foobar 1');
        };
    };
    var goo = function() {
        this.message = "gooBar";
        this.gooBar = function() {
            alert(this.message);
        };
    };
    var f1=new foo();
    var f2=new foo();
    var g1=new goo();
    var Foos=[];
    Foos[0]=f1;
    Foos[1]=f2;
    Foos[2]=g1;
    for (index = 0, len = Foos.length; index < len; ++index) {
        var dummy=Foos[index];
        console.log(dummy);
        for(c in dummy){
            var m='dummy.' + c.toString(); 
            if(eval(m+'.call')!=undefined){
                eval(m + '()');
            }
        }
    }
    

    【讨论】:

    • 是的,没有成功。不过,感谢您的尝试! :)
    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 2015-09-23
    • 2012-03-31
    • 2015-11-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多