JavaScript 命名空间调用其他函数方法

javascript namespace call other function methods

提问人:forX 提问时间:5/26/2017 更新时间:5/26/2017 访问量:577

问:

我尝试更改一些将方法调用到命名空间的方法。

  • 调用父方法(我认为这是不可能的)
  • 创建和调用继承函数
  • 在另一个方法(主要是 jquery onReady 事件函数)内部调用(this.MyFunction() 不工作)

我将每个命名空间拆分到文件中(希望保持这种方式)

我尝试如何从同一命名空间中的函数 B 调用函数 A? 但我没有成功拆分命名空间。

我的小提琴示例只有 1 个子命名空间,但可以更多。

https://jsfiddle.net/forX/kv1w2rvc/

 /**************************************************************************
    // FILE Master.js
    ***************************************************************************/
    if (!Master) var Master = {}; 
    Master.Print= function(text){
        console.log("master.Print :" + text);
      $("body").append("<div>master.Print : " + text + "</div>");
    }

    /**************************************************************************
    // FILE Master.Test1.js
    ***************************************************************************/
    if (!Master) var Master = {};
    if (!Master.Test1) Master.Test1  = {};
    /**************************************************************************
    * Descrition :
    *   Function for managing event load/documentReady
    **************************************************************************/
    Master.Test1.onReady = function () {
        $(function () {
            Master.Test1.Function1();   //try to replace because need all namespace.          

            try {
                   this.Function2(); //not working
            }
            catch(err) {
                console.log("this.Function2 not working");
                $("body").append("<div>this.Function2 not working</div>");
            }   

           try {
                this.Print("onReady");  //not working
           }
           catch(err) {
                console.log("this.Print not working");
              $("body").append("<div>this.Print not working</div>");
           }

          try {
                Print("onReady"); //not working
          }
          catch(err) {
                console.log("Print not working");
                $("body").append("<div>Print not working</div>");
          }     

        });
    }

    Master.Test1.Function1 = function () {
        console.log("Function1");
        $("body").append("<div>Function1</div>");    
        this.Function3();      //working because not inside another function   
    }

    Master.Test1.Function2 = function () {
            $("body").append("<div>Function2</div>");
        console.log("Function2");   

    }


    Master.Test1.Function3 = function () {
            $("body").append("<div>Function3</div>");
        console.log("Function3");

        Master.Print("Function3");  //try to replace because need all namespace.        
    }

    Master.Test1.onReady();
  • 我使用Master.Test1.Function1();我想改变它,因为 Function1 位于同一命名空间内。

  • 我使用Master.Print(“Function3”);我不认为我能改变这一点。我尝试使用它的方式,它更像是一个继承函数。但我不知道有没有办法做到这一点?

也许我应该更改我的命名空间方法?也许原型会做我想做的事?

JavaScript jQuery 命名空间

评论


答:

0赞 guest271314 5/26/2017 #1

this在 或 别名中 其中 是参数 。 随意引用。document.ready()jQuery().ready()function(){}$(function() {})thisthis.Function2()document

1赞 Saravana 5/26/2017 #2

您可以捕获 in 变量,因为 inside 将指向对象。如果您从不更改 -- 的调用上下文,则以下操作将起作用,即它始终在对象上调用,而不是在其他上下文中调用:thisthis$(function() {})documentonReadyTest1

Master.Test1.onReady = function () {
    var self = this;
    $(function () {
        self.Function1();
        // ..
    });
}

要访问,您必须使用对象进行引用,例如:,因为它在对象中不可用PrintMasterMaster.Print()Test1

0赞 pacifier21 5/26/2017 #3

javascript 中的“对象”的构建方式与大多数面向对象语言中的构建方式不同。从本质上讲,您正在构建的是静态方法的层次结构,这些方法本身没有真正的内部状态。因此,当调用其中一个定义的方法时,该方法的上下文(或状态)取决于调用该方法的对象。

如果你想有任何内部上下文,你需要创建一个“对象原型”的“实例”。此时,您可以在其他函数中使用“this.otherFunction”。下面是一个小例子:

var MyObject = function() {};

MyObject.functionOne = function() {
    console.log("Function 1");
    this.functionTwo();
};

MyObject.functionTwo = function() {
    console.log("Function 2");
};

var instanceOne = new MyObject();
instanceOne.functionOne();

您可能会在此处获得有关对象定义的更多信息

评论

0赞 forX 5/27/2017
大多数情况下,函数是静态的(无需创建实例)。但这是一种方法。不幸的是,子功能的问题仍然存在。Saravana 的答案对我的问题更有用。