Передайте функцию javascript в качестве параметра и оцените ее содержимое как содержимое класса - PullRequest
0 голосов
/ 10 апреля 2011

Можно ли передать функцию в качестве параметра методу и оценить его содержимое, как если бы оно было частью класса?

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

    this.CallThis = function()
    {

    };
}

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

Ответы [ 3 ]

1 голос
/ 10 апреля 2011

Если я последую вашему намерению:

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');
1 голос
/ 10 апреля 2011

Конечно, можно вызывать функцию, в этом случае с

param()

что касается "как если бы он был частью класса", если вы имеете в виду, будет ли он иметь доступ к своим членам через this, нет, не будет. Но вы можете передать ссылку на это (объект типа Class) функции, и она сможет получить доступ к своим членам через эту ссылку.

0 голосов
/ 10 апреля 2011

Я изменил класс так, как я думаю, вы, возможно, хотели, хотя Зирак, похоже, уже продемонстрировал основную идею.

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), как в первом примере, имеет более полезное преимущество, которое дает возможность каждому экземпляру класса использовать свои собственные функции или реализации (или вы можете использовать наследование).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...