1

以下のコードを検討してください。

空のオブジェクトを作成しました。そして、var1,var2,var3それらを宣言せずに追加しています。

var har = new Object();
har.var1 = "Var1";
har.var2 = "Var1";
har.var3 = "Var1";

alert( har.var1 );

これができれば、いつでも新しい属性を導入できるのに、なぜクラスを作成して属性を修正する必要があるのでしょうか?

4

1 に答える 1

2

そもそも、なぜオブジェクトを使用する必要があるのでしょうか? 非オブジェクト指向言語はすでにチューリング完全であるため、オブジェクトを使用して達成できることはすべて、オブジェクトなしでも実行できます。

あなたの例で示しているのは、実際にはオブジェクトではなく、単なる辞書です。このような、いくつかの関連するプロパティを一緒に保持する必要があるだけの場合、使用しているような匿名のプロトタイプ化されていないオブジェクトは、事実上の標準的なアプローチです (ただし、簡略化された構文で初期化するのが通例ですvar har = {})。オブジェクトデータ構造を使用しているためオブジェクトですが、オブジェクト指向ではありません。

対照的に、実際のオブジェクトは、データを定義するだけでなく、そのデータに対して実行できる操作も定義します。オブジェクトには、プロパティだけでなく、これらのプロパティで動作するメソッドもあります。これらのプロパティは通常、オブジェクト プロトタイプ (「クラス」と呼んでいますが、Javascript はクラス ベースの言語ではなく、プロトタイプベースの言語) で定義されます。プロトタイプで定義されたすべてのメソッドは、そのプロトタイプのすべてのインスタンス間で共有されます。

function Counter() {
    this.counter = 0;
}

Counter.prototype.increment = function() {
    this.counter++;
    alert(this.counter);
}

var c1 = new Counter();
var c2 = new Counter();

c1.increment(); // alerts 1
c1.increment(); // alerts 2
c2.increment(); // independent from c1: alerts 1 again

あなたの例のように、各インスタンスは依然として辞書です(さらにプロパティを追加することもできますが、コンストラクタとプロトタイプを持つことによって「固定」されていません)が、そのプロパティに対してタスクを実行することもできます。これもあなたのやり方で行うことができます:

c1 = {
    counter: 0,
    increment: function() {
        this.counter++;
        alert(this.counter);
    }
}

c2 = {
    counter: 0,
    increment: function() {
        this.counter++;
        alert(this.counter);
    }
}

ただし、プロトタイプを使用せずに 2 つのカウンターが必要な場合は、オブジェクト定義全体を複製する必要があることがわかります。これは、作成と保守が面倒で、各increment関数が個別に定義されるため、メモリも浪費します。

とはいえ、インスタンスが 1 つしか必要ないことがわかっているオブジェクトが必要な場合、そのオブジェクトのコンストラクターとプロトタイプを定義しても意味がありません。このようなオブジェクトは通常、実際のオブジェクトではなく名前空間と見なされます。

付録: 辞書とオブジェクト

ディクショナリは、名前付き要素を保持するデータ構造です。「辞書」のほかに、連想配列またはハッシュマップとも呼ばれます。Javascript のオブジェクトはディクショナリとして実装されます。各プロパティは、ディクショナリ内の名前付き要素です。プレーンなディクショナリに加えて、オブジェクトにはプロトタイプもあり、これはオブジェクトのようなものです。ディクショナリで名前付き要素を調べたときにそこにない場合、プロトタイプでも自動的に検索されます。このように、デフォルトのプロパティとメソッドはプロトタイプで一度だけ定義され、各インスタンスにコピーする必要はありません。(オブジェクトのプロトタイプは、多くの場合、instance.__proto__プロパティ。実際のプロトタイプは、標準によって内部のアクセス不可能なプロパティとして定義されています)

したがって、Javascript オブジェクトは実際には辞書です。単純な辞書を使用していくつかの関連するプロパティを一緒に格納する場合、Javascript にはオブジェクトではないObject辞書を作成するための個別の構文がないため、基本型のインスタンスを作成して辞書を保持します (それは問題ではありません)。var dict = new Objectまたはの場合var dict = {}、結果は同じです); したがって、コードで使用する辞書もオブジェクトです。

于 2012-07-06T05:54:10.993 に答える