回答:
オブジェクトリテラルと構築されたオブジェクトの唯一の違いは、プロトタイプから継承されたプロパティです。
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
常にオブジェクトリテラルを使用します
{id: 1, speaker:"john", country: "au"}
new READABLE_PART(ignore everything in here)
ではなく、非常にスキャン可能で自己文書化さ{read: "ignore", everything: "ignore", in: "ignore", here: "ignore"} // and then come up with READABLE_PART
れます。最初のバージョンは、ページングが急速に進んでいる間も読み取り可能です。第二に、あなたは単に理解するために構造体にリファクタリングします。
Cのような構造体をシミュレートするクラスを作成することは、これまで行ってきたように、最良の方法だと思います。
これは、関連するデータをグループ化し、関数へのパラメーターの受け渡しを簡素化する優れた方法です。実際のオブジェクト指向機能をシミュレートするために必要な追加の労力を考慮して、JavaScriptクラスはC ++クラスよりもC ++構造体に似ているとも私は主張します。
JavaScriptを別の言語のようにしようとすると速く複雑になることがわかりましたが、JavaScriptクラスを関数なしの構造体として使用することを完全にサポートしています。
Markusの答えに従って、新しいバージョンのJS(ES6だと思います)では、次のようにArrow FunctionsとRest Parameterを使用して、より単純に「struct」ファクトリを作成できます。
const Struct = (...keys) => ((...v) => keys.reduce((o, k, i) => {o[k] = v[i]; return o} , {}))
const Item = Struct('id', 'speaker', 'country')
var myItems = [
Item(1, 'john', 'au'),
Item(2, 'mary', 'us')
];
console.log(myItems);
console.log(myItems[0].id);
console.log(myItems[0].speaker);
console.log(myItems[0].country);
これを実行した結果は次のとおりです。
[ { id: 1, speaker: 'john', country: 'au' },
{ id: 2, speaker: 'mary', country: 'us' } ]
1
john
au
あなたはそれをPythonのnamedtupleに似せることができます:
const NamedStruct = (name, ...keys) => ((...v) => keys.reduce((o, k, i) => {o[k] = v[i]; return o} , {_name: name}))
const Item = NamedStruct('Item', 'id', 'speaker', 'country')
var myItems = [
Item(1, 'john', 'au'),
Item(2, 'mary', 'us')
];
console.log(myItems);
console.log(myItems[0].id);
console.log(myItems[0].speaker);
console.log(myItems[0].country);
そして結果:
[ { _name: 'Item', id: 1, speaker: 'john', country: 'au' },
{ _name: 'Item', id: 2, speaker: 'mary', country: 'us' } ]
1
john
au
ES6互換性を使用する場合は、構造体を定義する小さなライブラリを作成しました。
これは、プロジェクトリポジトリをチェックアウトできるJKTパーサーです。JKTパーサー
例として、このような構造体を作成できます
const Person = jkt`
name: String
age: Number
`
const someVar = Person({ name: "Aditya", age: "26" })
someVar.name // print "Aditya"
someVar.age // print 26 (integer)
someVar.toJSON() // produce json object with defined schema
設定するのはもっと大変ですが、保守性が1回限りの努力に勝る場合、これはあなたのケースかもしれません。
/**
* @class
*/
class Reference {
/**
* @constructs Reference
* @param {Object} p The properties.
* @param {String} p.class The class name.
* @param {String} p.field The field name.
*/
constructor(p={}) {
this.class = p.class;
this.field = p.field;
}
}
利点: