2012-03-13 45 views
4

如果我有一個運行一些初始化代碼的JavaScript類,那麼把這段代碼放在最上面,並在類的底部放置任何方法似乎是合乎邏輯的。問題是,如果初始化代碼包含一個方法調用,我得到'undefined'不是函數錯誤。我想象因爲該方法是在方法調用後定義的。人們通常如何構建JavaScript類來避免這種情況?他們是否將所有初始化代碼放在課程末尾?例如:如何構造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對象的好結構?

+0

我得到'類是Firebug的一個保留identifier':http://jsfiddle.net/ATeMb/我猜這是不是你指的錯誤,雖然。 – 2012-03-13 01:11:55

+0

@JaredFarrish是的,我意識到示例代碼使用保留字。用foo和對象與酒吧切換類自己嘗試。 – dqhendricks 2012-03-13 01:13:22

+0

更新爲['class'更改爲'cls'](http://jsfiddle.net/ATeMb/1/),現在我得到一個TypeError:this.start不是函數錯誤。 (我意識到可能是我發佈初步評論後的情況。) – 2012-03-13 01:14:08

回答

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

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

var object = new class(); 

現在你可以更動開始儘可能多的,只要你想在構造函數中。但不要使用關鍵字類,因爲它是一個保留字。

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; 
}; 
+0

不清楚你爲什麼要做't.start = start;',而不是僅僅通過執行this.start = function()...'來公開定義方法。 – dqhendricks 2012-03-13 01:16:10

+0

我在頂部定義了所有方法(公共和私有) - 應該可以從外部訪問的方法(公共)在額外的步驟中分配給對象。這樣,一種方法是公共還是私人並沒有什麼不同。換句話說:'start();'在課堂內運作,不管它從外部是否可見。 – Niko 2012-03-13 01:21:37

+0

啊,是的,你是對的。我感到困惑,抱歉。我已經編輯了我的代碼,現在它反映了底部有函數的版本。 – Niko 2012-03-13 10:52:01

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;

前運行
0

我喜歡http://ejohn.org/blog/simple-javascript-inheritance/,我覺得更多的編程OOP。

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

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

new myClass(); 
+0

我喜歡這個。如果我沒有弄錯,這要求我們在博客文章中包含基礎「類」定義?你如何用這種寫作方法創建非公共變量? – dqhendricks 2012-03-13 02:04:14

+0

單次使用var內部方法。私有成員或方法JavaScript對象不能容納。 – neworld 2012-03-13 08:23:39

+0

如果我使用原始文章中的例子,我可以有私有方法和變量。 – dqhendricks 2012-03-13 15:13:08

0

考慮在class的原型上製作start。由於class的所有實例可以共享相同的start,而不是爲每個實例創建新的start函數,因此這具有節省內存的好處。

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

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

var object = new class(); 
相關問題