2010-08-19 68 views
14

我有一個類似於下面的類。創建對象時,如何調用我的init方法?我不想創建我的對象的實例,然後像我在下面調用初始化。JavaScript類 - 對象初始化時的調用方法

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

沒有解決方案的工作,如果要使用被實際的定義原型和原型代碼恰好是低於這個構造函數的性質。 – 2015-07-30 02:06:32

回答

30

注意:構造函數函數名稱應以大寫字母開頭,以區別於普通函數,例如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函數。

+1

謝謝。我實際上試着調用'this.init();'發佈之前,但我在函數聲明之前進行調用,這就是爲什麼它不起作用。 =] – 2010-08-19 23:10:10

+0

如果我簡單地用'var obj = {init:function(){...}}'定義我的對象,我該怎麼做?我應該怎麼稱呼它? – Eugene 2011-05-27 11:12:08

+0

@Eugene - 出錯了:'var makeObj = function(x,y){return {a:x + y}; }'這是一個函數,可以在返回之前創建一個對象並執行所需的任何一次初始化。有時稱爲工廠功能。 – 2011-05-27 13:51:08

1

只需添加

this.init(); 

您myClass的功能。

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

謝謝,這是一個錯誤,當我真正的類轉換爲一個簡單的例子的問題。 – 2010-08-19 23:11:52

5

甚至有更順暢的方式來做到這一點:

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

這都將創建方法,並調用它。

1

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')