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