2009-11-20 6 views
7

JavaScriptクラスのプロトタイプとは何ですか?言い換えれば、JavaScriptのプロトタイプとは何ですか?

Example.prototype.method {} 

Example.method{} 

例のクラスを定義することの違いは何ですか?

編集:興味のある方のために、私はクラスメソッドとコンストラクタメソッドとの違いはこちら(下記の答えに加えて)偉大な説明を見つけた:http://idhana.com/2009/07/13/constructor-vs-class-methods-in-javascript/

編集2:フル答えを! http://blog.anselmbradford.com/2009/04/09/object-oriented-javascript-tip-creating-static-methods-instance-methods/

答えて

5

後者の例では、静的メソッドを作成していますが、Exampleがコンストラクタ関数である場合は継承されません。コンストラクタ関数のprototypeプロパティでプロパティを定義し、newキーワードでオブジェクトを作成することにより、新しく作成されたオブジェクトはコンストラクタのプロトタイプを継承し、したがってこれらのメソッドにアクセスできます。

例はString関数コンストラクタのプロトタイプで定義されたものがあったので、新しく作成された文字列がindexOf方法を有する..内蔵コアコンストラクタなどStringで定義されたメソッドであろう

typeof String.prototype.indexOf // 'function' 

var name = 'John'; 
alert(name.indexOf('J')) // 0 

ザ以下のコードは関数コンストラクタを作成します。最初に静的メソッドを定義し、オブジェクトを作成し、オブジェクトにgetNameメソッドがないことを確認してから、プロトタイプに定義し、オブジェクトにgetNameメソッドがあることを確認します。

function Name(name) { 
    this.name = name; 
}; 
Name.getName = function(){}; 

var john = new Name(); 
typeof john.getName // undefined 

var john = new Name(); 
Name.prototype.getName = function(){ alert(this.name)}; 
typeof john.getName 

john.constructor.prototype.getName == john.getName // true 

だから繰り返すために、ECMAScriptのに継承関数コンストラクタのプロトタイプのプロパティ/メソッドを定義することによって主に達成され、例は、で定義されたメソッドを持っている日付/番号/文字として、すべてのコアのコンストラクタであろう彼らのそれぞれのプロトタイププロパティは、newキーワードを使用してインスタンスを作成するときにこれらのメソッドを使用できるようにします。

新しく作成されたオブジェクトには、作成したコンストラクタを指すconstructorプロパティがあり、prototypeプロパティに直接アクセスできることに注意してください。私たちが作成したjohnオブジェクトは、getNameメソッドを直接所有していません。これは、インタプリタがコンストラクタに上向きに移動してそのプロトタイプ内で見つかるオブジェクト上でインタプリタが直接見つけることができないためです。

johnオブジェクトの新しいインスタンスを実際に作成する必要はありませんでした。他の答えで指摘されているように、初期コンストラクタを作成した後にプロトタイプのプロパティを定義でき、すべてのオブジェクトがプロトタイプを継承しますプロパティが作成された後でも

静的メソッドは、コンテキストに依存しないことができ、クラスの特定のインスタンスに依存しないことができ、したがって、これは静的メソッドではないであろうthisキーワードに頼ることはできない。

function Name(name) { 
    this.name = name; 
    this.getName = function() { return this.name; } 
}; 

この希望静的メソッドの例も:

Name.getName = function() {}; 

をしかし名前が、それはnameプロパティが何であるかを決定するために、オブジェクトのインスタンスに依存しなければならない暗示するように、あなたはより多くのGENERを持っている必要があるためgetName静的な作りで全く意味がありませんicヘルパー関数は、静的メソッドとしてDate.parseなどの解析関数のように機能し、コンストラクタにthis.foo = function(){}を定義するより効率的なので、プロトタイプにインスタンスメソッドを定義します。

+0

だから、いつName.getName = function(){}を使用したいですか? – sepiroth

+0

または、むしろ、プロトタイプ定義を使用せずにNameクラスのメソッド(および方法)を定義できますか? – sepiroth

+0

'getName'はパブリックメソッドなので、静的ではなくプロトタイプで定義します。パブリックまたはプロトタイプにする目的がない場合は静的メソッドを定義します。 –

2

プロトタイプはクラス定義のようですが、動的に変更できます。特定の型のオブジェクトをインスタンス化すると、プロトタイプがテンプレートとして使用されます。

プロトタイプを変更すると、そのタイプのオブジェクトに変更が加えられます。

関連する問題