0

次のように、オブジェクト クラスにメソッドを追加する人もいます。

Object.clone = function() {

}

この構文は、ピリオドのみの他の関数名と同じですか、それとも実際に Object クラスに追加されますか? これはプロトタイプメソッドと同じですか?これを行う(またはプロトタイプを使用する)ことと、単に関数のクローンを作成することの長所/短所は何ですか?

4

2 に答える 2

2

JavaScript では、すべてがオブジェクトです。つまり、オブジェクト リテラルの場合と同じように、任意のオブジェクトにプロパティをアタッチできます。次に例を示します。

var arr = [1,2,3];
arr.property = 'foo';

ただし、オブジェクト以外でこれを行うことはお勧めできません。

すべてのオブジェクトにはコンストラクターがあるため、配列にはArrayコンストラクターがあり、オブジェクトにはコンストラクターObjectなどがあります。prototypeオブジェクトの は、コンテキストがインスタンスであるオブジェクトです。これは、 でインスタンス化するときにカスタム オブジェクトで発生しますnew

メソッドを にアタッチするとprototype、そのオブジェクトのすべてのインスタンスで共有されます。関数をコンストラクターにアタッチすると、基本的に名前空間の下にグローバル (スコープに応じて) が隠されます。コンテキストはインスタンスではなく、インスタンスに依存しません。これらの関数は静的メソッドと考えることができます。

Object.prototypeこれは「マザーオブジェクト」なので、拡張は面倒です。コンストラクター自体を拡張するObjectことはそれほど悪くはありませんが、ベスト プラクティスではありません。最善の解決策は、独自の名前空間を作成することです。

var MY = {};

MY.clone = function(){};
于 2013-10-18T03:27:06.703 に答える
1

Object組み込みコンストラクターに静的関数を追加する必要はありません。これを行うと、コードの堅牢性にも問題があります。現在および将来の環境によっては、同じ名前の組み込みメソッドが導入され、名前の競合が発生する可能性があるためです。

メソッドを独自のオブジェクトに追加するだけです。

于 2013-10-18T03:24:49.043 に答える