Answers:
对象文字和构造对象之间的唯一区别是从原型继承的属性。
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)中,您可以使用箭头函数和Rest参数更简单地创建“结构”工厂,如下所示:
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
设置起来需要做更多的工作,但是如果可维护性胜过一次性的努力,那么您可能会遇到这种情况。
/**
* @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;
}
}
优点: