将javascript函数作为参数传递,并将其内容评估为类内容

时间:2011-04-10 09:51:58

标签: javascript oop class methods parameters

是否可以将函数作为参数传递给方法并将其内容评估为类似于该类的一部分?

function Class()
{
    this.Method = function( param )
    {
        // Call "CallThis"
    };

    this.CallThis = function()
    {

    };
}

var c = new Class();
c.Method(
    {
        evalThisContent: function()
        {
            this.CallThis();
        }
    }
);

3 个答案:

答案 0 :(得分:1)

当然可以调用该函数,在本例中使用

param()

至于“好像它是班级的一部分”,如果你的意思是它可以通过this访问其成员,不,它不会。但是您可以将对此(类型为Class的对象)的引用传递给函数,并且可以通过此引用访问其成员。

答案 1 :(得分:1)

如果我按照你的意图:

function Class()
{
    this.Method = function( param, name )
    {
        this[name] = param;
        param.call(this);
    };

    this.CallThis = function()
    {

    };
}

var c = new Class();

c.Method(function() {
    this.CallThis();
}, 'evalThisContent');

答案 2 :(得分:0)

我已经按照我认为你想要的方式修改了课程,虽然Zirak似乎已经证明了主要的想法。

function Class() {
}
Class.prototype.method = function(param) {
    if (typeof param === 'object' && param.evalThisContent) {
        param.evalThisContent.call(this);
    }
};
Class.prototype.callThis = function() {
    alert("I'm getting called indirectly!");
};

var c = new Class();
c.method(
    {
        evalThisContent: function()
        {
            this.callThis();
        }
    }
);

如果您愿意,您可以在原型上动态添加或更改“evalThisContent”,使其可供以后可能要调用它的所有对象使用:

Class.prototype.method = function(param) {
    if (typeof param === 'object' && param.evalThisContent && !Class.prototype.evalThisContent) {
        Class.prototype.evalContent = param.evalThisContent;
    }
    this.evalContent();
};

这样做的好处是不会每次都在内存中创建一个函数,也不会在call call(或apply)的情况下以不太理想的方式调用它,如第一个例子,有一个更常用的优点,允许Class的每个实例使用自己的函数或实现(或者你可以使用继承)。