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

Javascript:如何在原型类中调用变量函数?,javascript,class,project,prototype,Javascript,Class,Project,Prototype,好的,我们有一个正在进行的项目,它将在今天通过。但我有个问题。 这是示例代码: output.js var MapPrintDialog = Class.create(); MapPrintDialog.prototype = { // 他の画面からテンプレート情報を更新するために呼ばれる。 comboReload : function() { var val = tempComb.getValue(); tempComb.store.load({ ca

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

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");
但它给了我一个错误lol。我将如何解决这个问题?请不要太苛刻,我刚开始学习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();
}
define  :   function(){
    var DrawPrintAreaFrame = function(mode, noUpdateStatusBarText){
        //You function code
    }
    this.getDrawPrintAreaFrame = function(){
        return DrawPrintAreaFrame;
    }
}
var obj = new MapPrintDialog();
obj.DrawPrintAreaFrame("edit");
define  :   function(){
    MapPrintDialog.DrawPrintAreaFrame = function(){
        //You function code
    }
}

但它给了我:Javascript运行时错误:对象不支持属性或方法“DrawPrintAreaFrame”您有两种不同的方法:

1-您必须先这样更改它:

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();
}
define  :   function(){
    var DrawPrintAreaFrame = function(mode, noUpdateStatusBarText){
        //You function code
    }
    this.getDrawPrintAreaFrame = function(){
        return DrawPrintAreaFrame;
    }
}
var obj = new MapPrintDialog();
obj.DrawPrintAreaFrame("edit");
define  :   function(){
    MapPrintDialog.DrawPrintAreaFrame = function(){
        //You function code
    }
}
然后使用类创建对象:

var obj = new MapPrintDialog();
obj.define();
obj.getDrawPrintAreaFrame().call(obj, "edit");
2-删除define方法并将您的函数添加到prototype中:

MapPrintDialog.prototype.DrawPrintAreaFrame = function(){
    //your function code
}
创建对象并按如下方式调用方法:

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();
}
define  :   function(){
    var DrawPrintAreaFrame = function(mode, noUpdateStatusBarText){
        //You function code
    }
    this.getDrawPrintAreaFrame = function(){
        return DrawPrintAreaFrame;
    }
}
var obj = new MapPrintDialog();
obj.DrawPrintAreaFrame("edit");
define  :   function(){
    MapPrintDialog.DrawPrintAreaFrame = function(){
        //You function code
    }
}
这很有趣,因为我说你有两种方法,第三种方法刚刚出现:

3-只要使用
Prototype
框架,就可以使用
MapPrintDialog.addMethods
(用于向类中添加新实例方法),删除
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");
4-如果您需要类似静态方法的函数,而不需要创建实例,请尝试以下方法:

MapPrintDialog.DrawPrintAreaFrame = function(){
    //You function code
}
这样称呼它

MapPrintDialog.DrawPrintAreaFrame("edit");
如果要在运行时定义它,请将整个定义添加到define方法中,如下所示:

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();
}
define  :   function(){
    var DrawPrintAreaFrame = function(mode, noUpdateStatusBarText){
        //You function code
    }
    this.getDrawPrintAreaFrame = function(){
        return DrawPrintAreaFrame;
    }
}
var obj = new MapPrintDialog();
obj.DrawPrintAreaFrame("edit");
define  :   function(){
    MapPrintDialog.DrawPrintAreaFrame = function(){
        //You function code
    }
}

你不能这样做。您需要公开该函数。具体如何做到这一点取决于你想如何称呼它(例如,你想进行哪些尝试)。@Matt oh Ok。。如果我在原型外部创建了一个DrawPrintAreaFrame函数,我还能在原型内部调用它吗?因为原型中有一部分我需要调用我创建的函数。当然-就像你对
初始化
/
定义
所做的那样。哦,好的!非常感谢。我试试看你有没有试过我的答案?顺便问一下,什么是var模式,noUpdateStatusBarText;对于如果我可以像obj.getDrawPrintAreaFrame()那样调用它(obj,“edit”);没有使用var模式等。谢谢你提醒我这是额外的,我删除了它们我不能删除define:因为那里有其他js文件正在使用的方法和变量。我只是在其中插入了函数,因为在define中有一个变量,我需要它才能使函数工作。我真的很困惑,我不知道该怎么办,抱歉>哦。。好的,我试试第三个。顺便说一句如果我在创建DrawPrintAreaFrame函数的同一个js文件中,是否仍然需要添加var obj=new MapPrintDialog();对象DrawPrintAreaFrame(“编辑”);或者我可以简单地使用this.DrawPrintAreaFrame或其他东西,因为我必须在define tooJavaScript运行时错误中调用它:对象不支持属性或方法“addMethods”:/