在Javascript中构造

以前,当我需要存储一些相关的variables时,我会创build一个类。

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

但我想知道这是否是一个好的做法。 有没有其他更好的方法来模拟Javascript中的结构?

对象文字和构造对象之间的唯一区别是从原型inheritance的属性。

 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"} 

真正的问题是,语言中的结构应该是值types而不是引用types。 build议的答案build议使用对象(这是参考types)来代替结构。 虽然这可以达到其目的,但它避开了程序员实际上希望使用值types(如原语)代替引用types的好处。 值types,不应该导致内存泄漏。

我认为创build一个类来模拟类C结构,就像你一直在做的,是最好的方法。

这是将相关数据分组并简化将parameter passing给函数的好方法。 我还认为,JavaScript类更像C ++结构而不是C ++类,考虑到需要额外的努力来模拟真实的面向对象的特性。

我发现试图让JavaScript更像另一种语言变得更快,但我完全支持使用JavaScript类作为无function的结构。

我使用对象JSON风格的愚蠢的结构(没有成员函数)。

根据Markus的回答 ,在更新版本的JS(ES6我认为)中,您可以更简单地使用箭头函数和Rest参数创build一个“结构”工厂,如下所示:

 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