128

以前は、関連する変数を多数格納する必要がある場合、クラスを作成していました。

function Item(id, speaker, country) {
  this.id = id;
  this.speaker = speaker;
  this.country = country;
}
var myItems = [new Item(1, 'john', 'au'), new Item(2, 'mary', 'us')];

しかし、これが良い習慣であるかどうかは疑問です。JavaScript で構造体をシミュレートする他のより良い方法はありますか?

4

9 に答える 9

197

オブジェクト リテラルと構築されたオブジェクトの唯一の違いは、プロトタイプから継承されたプロパティです。

var o = {
  'a': 3, 'b': 4,
  'doStuff': function() {
    alert(this.a + this.b);
  }
};
o.doStuff(); // displays: 7

構造体ファクトリーを作成できます。

function makeStruct(names) {
  var names = names.split(' ');
  var count = names.length;
  function constructor() {
    for (var i = 0; i < count; i++) {
      this[names[i]] = arguments[i];
    }
  }
  return constructor;
}

var Item = makeStruct("id speaker country");
var row = new Item(1, 'john', 'au');
alert(row.speaker); // displays: john
于 2009-02-02T06:41:56.040 に答える
35

私は常にオブジェクトリテラルを使用します

{id: 1, speaker:"john", country: "au"}
于 2009-02-02T06:28:43.057 に答える
23

本当の問題は、言語の構造が参照型ではなく値型であると想定されていることです。提案された回答は、構造体の代わりにオブジェクト (参照型) を使用することを提案しています。これは目的を果たすことができますが、参照型の代わりに値型 (プリミティブなど) を使用する利点をプログラマが実際に望んでいるという点を回避します。たとえば、値型によってメモリ リークが発生することはありません。

編集:この目的をカバーするための提案が進行中です。

//today
var obj = {fname: "Kris", lname: "Kringle"}; //vanilla object
var gifts = ["truck", "doll", "slime"]; //vanilla array

//records and tuples - not possible today
var obj = #{fname: "Buddy", lname: "Hobbs"};
var skills = #["phone calls", "basketball", "gum recycling"];

于 2012-11-07T01:37:21.720 に答える
9

あなたが行ってきたように、C のような構造体をシミュレートするクラスを作成するのが最善の方法だと思います。

これは、関連するデータをグループ化する優れた方法であり、関数へのパラメーターの受け渡しを簡素化します。また、実際のオブジェクト指向機能をシミュレートするために必要な 追加の労力を考慮すると、JavaScript クラスは C++ クラスよりも C++ 構造体に似ているとも言えます。

JavaScript を別の言語のようにしようとすると、すぐに複雑になることがわかりましたが、JavaScript クラスを機能のない構造体として使用することを完全にサポートしています。

于 2011-08-13T22:56:52.907 に答える
3

ダム構造体 (メンバー関数なし) には JSON スタイルのオブジェクトを使用します。

于 2009-02-02T06:29:00.263 に答える