【问题标题】:JavaScript class - Call method when object initializedJavaScript 类 - 对象初始化时调用方法
【发布时间】:2011-04-01 09:54:39
【问题描述】:

我有一个类似于下面的课程。创建对象时如何调用init 方法?我不想创建我的对象的实例,然后像下面那样调用初始化。

var myObj = new myClass(2, true);
myObj.init();

function myClass(v1, v2) 
{
    // public vars
    this.var1 = v1;

    // private vars
    var2 = v2;

    // pub methods
    this.init = function() {
        // do some stuff        
    };

    // private methods
    someMethod = function() {
        // do some private stuff
    };
}

【问题讨论】:

  • 如果要使用的属性是实际定义的原型并且原型代码恰好位于此构造函数下方,则任何解决方案都不起作用。

标签: javascript object


【解决方案1】:

注意。构造函数名称应以大写字母开头,以区别于普通函数,例如MyClass 而不是 myClass

您可以从构造函数调用init

var myObj = new MyClass(2, true);

function MyClass(v1, v2) 
{
    // ...

    // pub methods
    this.init = function() {
        // do some stuff        
    };

    // ...

    this.init(); // <------------ added this
}

或者更简单地说,您可以将init 函数的主体复制到构造函数的末尾。 init 函数如果只被调用一次,则根本不需要它。

【讨论】:

  • 谢谢。我实际上尝试调用 'this.init();'在发布之前,但我在函数声明之前进行了调用,这就是它不起作用的原因。 =]
  • 如果我只是通过var obj = {init: function(){...}} 定义我的对象,我应该怎么做?我该怎么称呼它?
  • @Eugene - 有什么问题:var makeObj = function(x, y) { return { a: x + y }; } 这是一个创建对象并在返回它之前执行您需要的任何一次性初始化的函数。有时称为工厂函数。
  • 嗯,它没有任何问题,但是有一个巨大的对象,它已经用大括号定义了,它不能正常工作。现在一切都很好。没问题。 :)
【解决方案2】:

还有更流畅的方法来做到这一点:

this.init = function(){
  // method body
}();

这将创建方法并调用它。

【讨论】:

  • 仅当您不需要在方法中设置属性时才有效。否则 Daniel Earwicker ^
【解决方案3】:

请参阅下面的一个可能的答案,以及对您的代码的一些更正。

function myClass(v1, v2) 
{
    // public vars
    this.var1 = v1;

    // private vars
    // use var to actually make this private
    var var2 = v2;

    // pub methods
    this.init = function() {
        // do some stuff        
    };

    // private methods
    // this will be private as though it had been declared with var
    function someMethod() {
        // do some private stuff
    };

    //call init
    this.init();
}

【讨论】:

  • 谢谢,在将我的真实课程转换为问题的简单示例时,这是一个错字。
【解决方案4】:

ECMAScript 2015 中引入的 JavaScript 类主要是 JavaScript 现有的基于原型的继承的语法糖。类语法并未向 JavaScript 引入新的面向对象的继承模型。 JavaScript 类提供了一种更简单、更清晰的语法来创建对象和处理继承。

-MDN web docs

使用此语法时,因为只有 constructor() 方法在实例化时运行,所以您不能自动实例化对象。你总是要加user = new MyUser()

var user;

class MyUser {
  constructor(var1, var2) {

    this.var1 = var1;
    this.var2 = var2;

  }

  static staticMethod() {

    // accessed directly with the class name `MyUser`

  }

  instanceMethod() {

    // accessed with object instance
return true
  }

}

user = new MyUser('hey','there')

【讨论】:

    【解决方案5】:

    只需添加

    this.init();
    

    到你的 myClass 函数。

    【讨论】:

      猜你喜欢
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2011-05-30
      相关资源
      最近更新 更多