次のように、オブジェクト クラスにメソッドを追加する人もいます。
Object.clone = function() {
}
この構文は、ピリオドのみの他の関数名と同じですか、それとも実際に Object クラスに追加されますか? これはプロトタイプメソッドと同じですか?これを行う(またはプロトタイプを使用する)ことと、単に関数のクローンを作成することの長所/短所は何ですか?
次のように、オブジェクト クラスにメソッドを追加する人もいます。
Object.clone = function() {
}
この構文は、ピリオドのみの他の関数名と同じですか、それとも実際に Object クラスに追加されますか? これはプロトタイプメソッドと同じですか?これを行う(またはプロトタイプを使用する)ことと、単に関数のクローンを作成することの長所/短所は何ですか?
JavaScript では、すべてがオブジェクトです。つまり、オブジェクト リテラルの場合と同じように、任意のオブジェクトにプロパティをアタッチできます。次に例を示します。
var arr = [1,2,3];
arr.property = 'foo';
ただし、オブジェクト以外でこれを行うことはお勧めできません。
すべてのオブジェクトにはコンストラクターがあるため、配列にはArray
コンストラクターがあり、オブジェクトにはコンストラクターObject
などがあります。prototype
オブジェクトの は、コンテキストがインスタンスであるオブジェクトです。これは、 でインスタンス化するときにカスタム オブジェクトで発生しますnew
。
メソッドを にアタッチするとprototype
、そのオブジェクトのすべてのインスタンスで共有されます。関数をコンストラクターにアタッチすると、基本的に名前空間の下にグローバル (スコープに応じて) が隠されます。コンテキストはインスタンスではなく、インスタンスに依存しません。これらの関数は静的メソッドと考えることができます。
Object.prototype
これは「マザーオブジェクト」なので、拡張は面倒です。コンストラクター自体を拡張するObject
ことはそれほど悪くはありませんが、ベスト プラクティスではありません。最善の解決策は、独自の名前空間を作成することです。
var MY = {};
MY.clone = function(){};
Object
組み込みコンストラクターに静的関数を追加する必要はありません。これを行うと、コードの堅牢性にも問題があります。現在および将来の環境によっては、同じ名前の組み込みメソッドが導入され、名前の競合が発生する可能性があるためです。
メソッドを独自のオブジェクトに追加するだけです。