在创建Javascript“类”的实例时,有没有办法构造对象以便可以访问所有方法?

时间:2014-11-21 14:01:21

标签: javascript

有没有办法在Javascript中创建一个对象,以便构造函数可以使用它的所有方法?

我发现很难清楚地说出我的问题......这是一个例子!

鉴于此课程

function Example() {
  var someVar = something;
  var moreState = initializedToSomethingElse; 

  verifySomething(); <-- Fails! 

  this.verifySomething = function() {
    // do verify stuff
  }
}

我无法在构造函数中调用verifySomething,因为就实例而言,该方法尚不存在。所以,我得到一个未定义的错误。有没有更好的方法在JavaScript中创建对象,以便我可以避免这个问题?

1 个答案:

答案 0 :(得分:5)

  

有没有办法在Javascript中创建一个对象,以便构造函数可以使用它的所有方法?

您可以在创建后调用任何方法。在您的示例中,有两个问题:

  1. 您尚未创建该方法

  2. 您正在调用它 - 在JavaScript中,使用对象限定符(通常在构造函数中为this.)不是可选的,因为它在某些其他语言中是

  3. 如果在构造函数的prototype属性上定义方法,只要这些赋值在调用构造函数之前发生(通常是真的,并且有保证它的技术),这些方法将在{ {1}}在构造函数中。如果在构造函数中创建方法(如示例所示),只需先创建它们。

    以下是使用构造函数的this属性的示例,该属性引用将用作通过prototype创建的实例原型的对象:

    new

    这是一个在构造函数中定义的示例,该示例利用函数声明(而不是表达式)被“提升”的事实(在任何逐步执行代码之前完成)。

    function Example() {
      var someVar = something;
      var moreState = initializedToSomethingElse; 
    
      this.verifySomething(); // <== Works
    }
    Example.prototype.verifySomething = function() {
        // do verify stuff
    };
    
    var e = new Example();
    

    如果您在调用之前真的不喜欢这样做,那么可以使用function Example() { var someVar = something; var moreState = initializedToSomethingElse; this.verifySomething = verifySomething; // <== Note we assign first this.verifySomething(); // <== Works function verifySomething() { // do verify stuff } } var e = new Example();

    .call

    我在上面提到过,有些技术可以保证构造函数的function Example() { var someVar = something; var moreState = initializedToSomethingElse; verifySomething.call(this); // <== Works // this.verifySomething(); // <== Would not work this.verifySomething = verifySomething; // <== Note we assign after function verifySomething() { // do verify stuff } } var e = new Example(); 属性在调用构造函数之前已经完全充实。这是其中之一(使用范围函数):

    prototype

    通过上述内容,在包含直接调用的作用域函数之外的代码无法使用var Example = (function() { function Example() { var someVar = something; var moreState = initializedToSomethingElse; this.verifySomething(); // <== Works } Example.prototype.verifySomething = function() { // do verify stuff }; return Example; })(); var e = new Example(); ,直到该作用域函数完成后,因此完全设置Example属性。