fields
должен быть массивом, тогда как labels
и rules
должны быть объектами, так как вы хотите использовать строки в качестве ключей. Кроме того, addField()
одинаково для каждого экземпляра FormBuddy()
(имена функций конструктора должны начинаться с заглавной буквы) и должны находиться в прототипе, то есть
function FormBuddy() {
this.fields = []; // this is the same as `new Array()`
this.labels = {}; // this is the same as `new Object()`
this.rules = {};
}
FormBuddy.prototype.addField = function(field, label, rule) {
this.fields.push(field);
this.labels[field] = label;
this.rules[field] = rule;
};
Вы можете получить доступ к ярлыкам / правилам через
var buddy = new FormBuddy();
buddy.addField('foo', 'bar', 'baz');
alert(buddy.labels['foo']);
alert(buddy.rules.foo);
Просто, чтобы еще больше разозлить Лука;), вот еще одна версия, которая также не содержит ничего:
function FormBuddy() {
this.fields = [];
}
FormBuddy.prototype.addField = function(id, label, rule) {
var field = {
id : id,
label : label,
rule : rule
};
this.fields.push(field);
this['field ' + id] = field;
};
FormBuddy.prototype.getField = function(id) {
return this['field ' + id];
};
var buddy = new FormBuddy();
buddy.addField('foo', 'label for foo', 'rule for foo');
Он похож на вторую версию Гамбо, но его объект fields
объединен с экземпляром FormBuddy
. Вместо этого добавляется массив fields
, чтобы обеспечить быструю итерацию.
Чтобы получить доступ к метке поля, правилу или идентификатору, используйте
buddy.getField('foo').label
Чтобы перебрать поля, используйте
// list rules:
for(var i = 0, len = buddy.fields.length; i < len; ++i)
document.writeln(buddy.fields[i].rule);