【问题标题】:How do I create a Javascript package with a constructor in it?如何创建一个带有构造函数的 Javascript 包?
【发布时间】:2012-05-04 19:54:59
【问题描述】:

在这里,我尝试创建一个名为 com.matogen.ght 的包,其中包含一个类 Calendar。我希望在实例化日历对象时自动调用 init() 方法。下面的示例有效,但我仍然必须显式调用 init() 方法。

var com = {
    matogen : {
        ght : {
            'Calendar' : function() {       

                this.init = function() {
                    console.log("This is my constructor");
                }

            }
        }
    } 
}

$(document).ready(function() {
    var cal = new com.matogen.ght.Calendar();
    cal.init();

});

【问题讨论】:

  • 我在 JavaScript 的 OOP 方面没有太多经验,所以任何关于如何改进代码的提示和建议都值得赞赏:)
  • 顺便说一句,“日历”周围的引号是不必要的。

标签: javascript constructor package


【解决方案1】:

只需像这样更改您的 init 函数

this.init = (function() {
    console.log("This is my constructor");
}());

使用自执行的匿名函数,或者,如果您愿意,可以像这样调用函数本身

...
    Calendar : function() {       

        this.init = function() {
            console.log("This is my constructor");
        };
        this.init();
    }
...

【讨论】:

  • 在您的第一个示例中,this.init 被分配给 undefined。函数调用是立即的,但函数不会调用自身。
  • @LeeKowalkowski,那它是如何工作的?我一直认为它会调用自己(上面的例子确实有效 - 我在问它为什么有效)......:/
  • 它可以工作,但你不会没有,是一个 init() 函数,您可以随后从其他地方调用它,因为函数的结果被分配给 this.init,并且函数什么也没返回。如果您再也不需要调用init(),那么即使拥有函数的句柄或根本没有函数也没有意义。调用 自身 的函数将是递归的(即从函数内部调用自身)。这是一个函数声明,它立即被它的超级上下文调用,而不是被它自己调用。
【解决方案2】:

好吧,正如你所做的那样newcom.matogen.ght.Calendar()Calendar() 你的构造函数。

所以:

var com = {
    matogen : {
        ght : {
            Calendar : function() {       
                console.log("This is my constructor");
            }
        }
    } 
}

...应该是准确的。

【讨论】:

  • 那么,如果我在 inside Calendar 中有另一个方法,我将如何调用它,比如说 init()?
  • 你可以在函数中拥有函数,你只需像往常一样调用它们。如果要从函数外部调用它们,则需要导出其引用。在您问题的示例中,您通过将匿名函数分配给this.init 来导出其引用。 this 指的是您在调用函数时使用new 创建的对象。该新对象已分配给您的 cal 变量。
猜你喜欢
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多