【问题标题】:Pass javascript function as parameter and evaluate its content as class content将 javascript 函数作为参数传递,并将其内容评估为类内容
【发布时间】:2011-08-02 10:20:57
【问题描述】:
是否可以将函数作为参数传递给方法并评估其内容,就好像它是类的一部分一样?
function Class()
{
this.Method = function( param )
{
// Call "CallThis"
};
this.CallThis = function()
{
};
}
var c = new Class();
c.Method(
{
evalThisContent: function()
{
this.CallThis();
}
}
);
【问题讨论】:
标签:
javascript
oop
class
methods
parameters
【解决方案1】:
当然可以调用该函数,在这种情况下使用
param()
至于“好像它是班级的一部分”,如果您的意思是它可以通过this 访问其成员,不,它不会。但是您可以将 this(Class 类型的对象)的引用传递给函数,它可以通过此引用访问其成员。
【解决方案2】:
如果我遵循你的意图:
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');
【解决方案3】:
我已经按照您可能想要的方式修改了课程,尽管 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)与第一个示例一样,具有允许类的每个实例使用其自己的函数或实现(或者您可以使用继承)的更普遍有用的优势。