В последних версиях WebKit (Safari, Chrome) или Firefox вы можете определять функции получения и установки :
var o = {a: 7, get b() {return this.a + 1;}, set c(x) {this.a = x / 2}};
o.b // result is 8
o.a = 10
o.b // result is 11
Тогда вы бы сделали это:
var Car = function(vendor, model, year) {
return {
vendor: vendor,
model: model,
year: year,
get name() { return this.vendor + " " + this.model + " " + this.year; }
};
};
И получите желаемый результат.
Я не знаю, поддерживают ли IE или Opera ту или иную версию. Если вам нужно поддерживать что-либо, кроме недавних браузеров Safari, Chrome или Firefox, тогда лучше использовать функцию для доступа к имени, а не оставлять его как свойство:
var Car = function(vendor, model, year) {
return {
vendor: vendor,
model: model,
year: year,
name: function() { return this.vendor + " " + this.model + " " + this.year; }
};
};
А потом:
var foo = Car("Toyota","Corola",2007);
alert(foo.name()); //alerts "Toyota Corola 2007"
foo.vendor = "Mitsubishi";
alert(foo.name()); //alerts "Mitsubishi Corola 2007"