7

私はJavaScriptでのオブジェクト指向プログラミングに比較的慣れていないので、JavaScriptでオブジェクトを定義して使用するための「最良の」方法がわかりません。以下に示すように、オブジェクトを定義して新しいインスタンスをインスタンス化する「標準的な」方法を見てきました。

function myObjectType(property1, propterty2) {
    this.property1 = property1,
    this.property2 = property2
}
// now create a new instance
var myNewvariable = new myObjectType('value for property1', 'value for property2');

しかし、私はこの方法でオブジェクトの新しいインスタンスを作成する他の方法を見てきました:

var anotherVariable = new someObjectType({
    property1:    "Some value for this named property",
    property2:    "This is the value for property 2"
});

私はその2番目の方法がどのように表示されるかが好きです-コードは自己文書化されています。しかし、私の質問は次のとおりです。

  1. どちらが「より良い」ですか?

  2. その2番目の方法を使用して、その暗黙のコンストラクターでオブジェクト型を定義する「古典的な」方法を使用して定義されたオブジェクト型の変数をインスタンス化できますか?

  3. これらのオブジェクトの配列を作成したい場合、他に考慮事項はありますか?

前もって感謝します。

4

4 に答える 4

7

それは本当に味にかかっています。こちらです:

var anotherVariable = new someObjectType({
    property1:    "Some value for this named property",
    property2:    "This is the value for property 2"
});

...一般に、2/3 を超える引数がある場合は、読みやすくなり、オプションの引数の問題を回避しやすくなるため、より優れています ( fn(null,null,null,123'))。

もう 1 つの考慮事項は、パフォーマンスです。従来の方法で引数を渡す方が高速ですが、この速度の向上は、パフォーマンスが非常に重要な状況でのみ顕著になります。

その暗黙のコンストラクターでオブジェクト型を定義する「古典的な」方法を使用して定義されたオブジェクト型の変数をインスタンス化するために、その 2 番目の方法を使用できますか?

簡単ではありません。引数を渡すだけでなく、ハッシュを使用してコンストラクターをインスタンス化したい場合、およびソースを制御できない場合は、それを「ラップ」できます。

var _constructor = SomeConstructorFunction;

SomeConstructorFunction = function(hash) {
    return new _constructor(hash.property1, hash.property2);
};

ただし、スタイルのためだけにサードパーティの API をいじることはあまりお勧めしません。

これらのオブジェクトの配列を作成したい場合、他に考慮すべきことはありますか?

配列の大きさは?正確には何のための配列ですか?パフォーマンスは検討する価値があるかもしれません...

于 2010-04-16T13:49:16.583 に答える
3

JavaScript オブジェクトを作成する最善の方法は、new を使用して終了することです (少なくともクロックフォード キャンプに加入している場合)。

myObjectType = function(props) {
  // anything defined on props will be private due to the closure

  props.privateVar = "private";

  // anything defined on obj will be public
  obj = {};

  obj.testing = new function() {
    alert(props.privateVar);
  };

  return obj;
};
instance = myObjectType({prop1: "prop"});

// if we want inheritance, it just means starting with the base type instead of
// a new object
subType = function(props) {
  obj = myObjectType(props);
  obj.subTypeProperty = "hello.";

  return obj;
};

Javascript: The Good Parts の52 ページ、強くお勧めします :-)

于 2010-04-16T14:04:32.527 に答える
2

1)とにかく、方法#2がはるかに好ましいと思います。2 つのプロパティの例はそれほど違いはありませんが、次のようにしたい場合はどうすればよいでしょうか。

var anotherVariable = new someObjectType({
    property1:    "Some value for this named property",
    property2:    "This is the value for property 2"
    //Leaving several properties out, don't want them populated
    property8:    "This is the value for property 8"
    property9:    "This is the value for property 9"

});  

null最初のメソッドでオブジェクトに提供したい場合と提供したくない場合があるプロパティを処理するために必要なオーバーロード (または s の追跡) の組み合わせの数を考えてみてください。これは、はるかに拡張可能で柔軟なアプローチです。

2) 空のコンストラクターで許可するだけです。これにより、インスタンス化がよりクリーンになります。

3) 長さ/読みやすさ、特に複数のオブジェクトの場合。JSON を見てください。少なくとも私にとっては、かなりきれいで読みやすいです。そのスタイルが好きなら、オブジェクトの配列を作成する方法は方法 2 と非常によく似ています。

于 2010-04-16T13:48:59.250 に答える
1

2 番目の方法は見栄えがよく、セットアップ オプションが多数ある「クラス」の場合に便利です。ただし、実際にはその過程で別のオブジェクトを構築していることに注意してください。

1 つまたは別の Javascript フレームワークからいくつかのコードを読み取り、魅力的なスタイルを見つけることをお勧めします。

于 2010-04-16T13:44:36.000 に答える