如何构建javascript对象,而不是未定义'是不是功能错误?

时间:2012-03-13 01:06:41

标签: javascript

如果我有一个运行一些初始化代码的javascript类,那么把这个代码放在顶部,以及类底部的任何方法似乎都是合乎逻辑的。问题是,如果初始化代码包含方法调用,我得到'undefined'不是函数错误。我想是因为该方法是在方法调用之后定义的。人们通常如何构建javascript类以避免这种情况?他们是否将所有初始化代码放在课程的最后?例如:

var class = function() {
   this.start();
   this.start = function() {
      alert('foo');
   };
};
var object = new class();

导致错误,而:

var class = function() {
   this.start = function() {
      alert('foo');
   };
   this.start();
};
var object = new class();

没有。什么被认为是像这样的javascript对象的好结构?

5 个答案:

答案 0 :(得分:2)

这就是我要做的事情

// create a "namespace"
var com = com || {};
com.domain = com.domain || {};

// add "class" defintion
com.domain.MyClass = function(){
    var privateFields = {};
    var publicFields = {};

    privateFields.myFunction = function(){
        // do something
    }

    publicFields.initialize = function(){ 
        privateFields.myFunction();
    }
    return publicFields;
}

var myClass = new com.domain.MyClass();
myClass.initialize();

当然,您可以将initialize();设为“私有”并在return publicFields;之前运行

答案 1 :(得分:1)

var class = function() {
   this.start();

};
class.prototype.start = function() {
      alert('foo');
   };

var object = new class();

现在你可以在构造函数中尽可能多地启动。但是不要使用关键字class,因为它是一个保留字。

答案 2 :(得分:0)

我实际上用这样的结构做了很多工作:

var foo = function() {
    // Actual construction code...
    start();            // <-- doesn't make a difference if functions are
    privateMethod();    //     public or private!

    // ---------------------------------

    function start() {
        // ... whatever ...
    };

    function privateMethod() {
        // ... whatever ...
    };

    // ---------------------------------

    // Add all public methods to the object (if start() was only used internally
    // just don't assign it to the object and it's private)
    this.start = start;
};

答案 3 :(得分:0)

我喜欢http://ejohn.org/blog/simple-javascript-inheritance/,我觉得OOP编程更多。

var myClass = Class.extend({
  init: function () {
    this.foo();
  },

  foo: function () {
    alert("foo");
  }
});

new myClass();

答案 4 :(得分:0)

考虑在start的原型上制作class方法。这有节省内存的好处,因为class的所有实例都可以共享相同的start,而不是为每个实例创建新的start函数。

var class = function() {
   this.start();
};

class.prototype.start = function() {
   alert('foo');
};

var object = new class();