後者の例では、静的メソッドを作成していますが、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(){}
を定義するより効率的なので、プロトタイプにインスタンスメソッドを定義します。
だから、いつName.getName = function(){}を使用したいですか? – sepiroth
または、むしろ、プロトタイプ定義を使用せずにNameクラスのメソッド(および方法)を定義できますか? – sepiroth
'getName'はパブリックメソッドなので、静的ではなくプロトタイプで定義します。パブリックまたはプロトタイプにする目的がない場合は静的メソッドを定義します。 –