2012-02-22 6 views
1

JavaScriptでクラスを定義する方法を学習しようとしています。私はこのリンク(http://www.phpied.com/3-ways-to-define-a-javascript-class/)を見つけましたが、私のニーズを満たしていないようです。基本的には、プロパティと関数を持つクラスが必要です。クラスが初期化されるとき、私は自動的にinit関数を呼び出したいと思います。この時点で、次のコードを使用して新しいアイテムを作成すると、エラーが発生します。トラブルシューティングJavaScriptでクラスを定義する

var item = new Item();

エラーメッセージ:オブジェクトには「init」メソッドがありません。

私のクラス定義は以下のようになります。

function Item() { 
    this.id = null; 
    this.name = ""; 
    this.description = ""; 

    this.init(); 
    this.init = function() { 
     this.id = "54321"; 
    }; 
} 

私が間違って何をしているのですか? JavaScriptでコンストラクタを作成するにはどうすればよいですか?

答えて

0

Itemクラスのインスタンスを作成するときに、Itemのプロトタイプを使用して、ロジックの一部をコンストラクタから取り出すことができます。ここでは、一度にすべてのプロパティを設定するには、オブジェクトに設定されている - 以下の例では、アイテムは試作品を操作するための多くの方法があります(init関数を含む)プロトタイプ

function Item() { 
    this.init(); 
} 

Item.prototype = { 
    id: null, 
    name: '', 
    description: '', 
    init: function() { 
    this.id = "54321"; 
    } 
}; 

からすべてのデフォルトのプロパティを使用してインスタンス化されますItem.prototype.someVariable = something形式の構文を使用して個々の項目を個別に追加した可能性もあります。

プロトタイプの設定に関する注意 - プリミティブ以外のデータ型(つまり、ブール値、数値または文字列でない)はすべてのインスタンスで共有されます(init関数のような関数を共有するのに便利です)。

+0

ありがとうございます。私が間違っているが、ブール値、数字、文字列のプリミティブ型ではない場合、私を修正してください。たぶん私は間違って準備ができている。いずれにしても、インスタンス固有の配列を作成するにはどうすればよいですか? – user208662

+0

そうです - 私は非基本的なものではありません。boolean数と文字列ではありません...インスタンス単位で配列やオブジェクトが必要な場合は、コンストラクタで、またはプロトタイプの別の関数の一部として、関数Item(){this.obj = {}; } ' – steveukx

10

定義する前にinit()に電話しています。単純に定義以下の呼び出しを移動:それは定義されています前に

function Item() { 
    this.id = null; 
    this.name = ""; 
    this.description = ""; 

    this.init = function() { 
     this.id = "54321"; 
    }; 

    this.init(); 
} 
+0

これは、JavaScriptを使ってクラスを定義する間違った方法です。新しいインスタンスを作るたびに、エンジンは単に新しい 'this'を渡すのではなく、すべてのメソッドを再作成します。プロトタイプと主な機能をコンストラクタとして使うのが良いでしょう – Eopin

0

あなたがinitメソッドを呼び出しています。 JavaScriptのFunctionDeclarationだけが持ち上げられます。変数にはFunctionExpressionが割り当てられていません。覚えておきますが、宣言だけが吊り上げられます。定義ではありません。

関連する問題