【问题标题】: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)与第一个示例一样,具有允许类的每个实例使用其自己的函数或实现(或者您可以使用继承)的更普遍有用的优势。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-07
          • 2012-03-17
          • 1970-01-01
          • 2012-01-04
          • 2023-02-25
          • 2013-10-24
          相关资源
          最近更新 更多