Javascript:如何在原型类中调用变量函数?

时间:2013-12-28 06:11:27

标签: javascript class project prototype

好的,我们正在进行一个项目,今天就要通过了。但我有一个问题。 这是示例代码:

output.js

var MapPrintDialog = Class.create();
MapPrintDialog.prototype = {

    // 他の画面からテンプレート情報を更新するために呼ばれる。
comboReload : function() {
    var val = tempComb.getValue();
    tempComb.store.load({
        callback: function(result, o) {
            if (this.store.data.keys.indexOf(val) == -1) {
                this.setValue(this.store.data.keys[0]);
                this.fireEvent("select", this);
            }
        }.createDelegate(tempComb)
    });
},

initialize  :   function(){
    this.define();
},

define  :   function(){
    var DrawPrintAreaFrame = function(mode, noUpdateStatusBarText){
    var cs = getCurrentSetting();

        if (mode == "init" || mode == "edit"){     
            PrintController.DrawMapPrintArea(cs.center.x, cs.center.y, cs.scale, cs.result.PrintMaps[0].Width, cs.result.PrintMaps[0].Height, cs.result.PageRowCount, cs.result.PageColumnCount, mode);
        }
        else if (mode == "delete"){
            PrintFrameManager.ClearPrintFrame();
        }    

        if (noUpdateStatusBarText) {
            gisapp.noUpdateStatusBarText = true;
        }
        gisapp.refreshMap();
    }
}

现在我的问题是,如何从另一个js文件调用“DrawPrintAreaFrame”?

我试过了:

MapPrintDialog.prototype.define().DrawPrintAreaFrame("edit");
MapPrintDialog.prototype.define.DrawPrintAreaFrame("edit");
MapPrintDialog.define().DrawPrintAreaFrame("edit");
MapPrintDialog.define.DrawPrintAreaFrame("edit");
MapPrintDialog.DrawPrintAreaFrame("edit");
DrawPrintAreaFrame("edit");

但它给了我一个错误大声笑。我该如何解决这个问题?请不要太苛刻,我刚开始学习javascript但是他们给了我一个不是真正“初学者”友好的高级项目XD

编辑----------------------

好的,现在我试着像这样修改它:

var MapPrintDialog = Class.create();
MapPrintDialog.prototype = {

    // 他の画面からテンプレート情報を更新するために呼ばれる。
comboReload : function() {
    var val = tempComb.getValue();
    tempComb.store.load({
        callback: function(result, o) {
            if (this.store.data.keys.indexOf(val) == -1) {
                this.setValue(this.store.data.keys[0]);
                this.fireEvent("select", this);
            }
        }.createDelegate(tempComb)
    });
},

initialize  :   function(){
    this.DrawPrintAreaFrame("edit");
    }
}

function DrawPrintAreaFrame(mode, noUpdateStatusBarText){
  var cs = gisapp.getCurrentView();

  if (mode == "init" || mode == "edit"){     
      PrintController.DrawMapPrintArea(cs.center.x, cs.center.y, cs.scale, cs.result.PrintMaps[0].Width, cs.result.PrintMaps[0].Height, cs.result.PageRowCount, cs.result.PageColumnCount, mode);
  }
  else if (mode == "delete"){
      PrintFrameManager.ClearPrintFrame();
  }    

  if (noUpdateStatusBarText) {
      gisapp.noUpdateStatusBarText = true;
  }
  gisapp.refreshMap();
}

但它给了我: Javascript运行时错误:对象不支持属性或方法'DrawPrintAreaFrame'

1 个答案:

答案 0 :(得分:0)

你有两种不同的方式:

1 - 你必须先改变它:

define  :   function(){
    var DrawPrintAreaFrame = function(mode, noUpdateStatusBarText){
        //You function code
    }
    this.getDrawPrintAreaFrame = function(){
        return DrawPrintAreaFrame;
    }
}

然后使用您的类创建您的对象:

var obj = new MapPrintDialog();
obj.define();
obj.getDrawPrintAreaFrame().call(obj, "edit");

2 - 删除define方法并将您的函数添加到原型中:

MapPrintDialog.prototype.DrawPrintAreaFrame = function(){
    //your function code
}

创建您的对象并简单地调用您的方法:

var obj = new MapPrintDialog();
obj.DrawPrintAreaFrame("edit");
  

这很有趣,因为我说你有两种方式,第三种方式刚出现:

3 - 就使用Prototype框架而言,您可以使用MapPrintDialog.addMethods,这可用于向您的班级添加新的实例方法,删除您的{ {1}}和define函数并添加以下内容:

DrawPrintAreaFrame

或者即使不删除您的方法,您也可以使用它:

MapPrintDialog.addMethods({
    DrawPrintAreaFrame: function DrawPrintAreaFrame(){
        //your code
    }
});

并创建您的实例并调用方法:

define  :   function(){
    var DrawPrintAreaFrame = function(mode, noUpdateStatusBarText){
        //You function code
    }
    MapPrintDialog.addMethods({ DrawPrintAreaFrame: DrawPrintAreaFrame });
}
如果你需要你的函数就像一种静态方法,而不需要创建一个实例,那么试试这个:

var obj = new MapPrintDialog();
obj.DrawPrintAreaFrame("edit");

并像这样称呼它

MapPrintDialog.DrawPrintAreaFrame = function(){
    //You function code
}

如果要在运行时定义它,请将整个定义添加到define方法中,如下所示:

MapPrintDialog.DrawPrintAreaFrame("edit");