2011-06-20 76 views
0

的JavaScript访问父对象我有这样的汽车功能:内部功能

var Car = function(vendor, model, year) { 
    return { 
     vendor: vendor, 
     model: model, 
     year: year, 
     name: (function() { 
      return vendor + " " + model + " " + year; 
     })() 
    }; 
}; 
var foo = Car("Toyota","Corola",2007); 
alert(foo.name); //alerts "Toyota Corola 2007" 

这工作,但我想name能够根据vendormodel,并year改变。

taxi.vendor = "Mitsubishi"; 
alert(taxi.vendor); //still alerts "Toyota Corola 2007" 

我怎么能代替让它根据vendor性质的变化提醒Mitsubishi Corola 2007

编辑:而渔获-name必须保持一个属性,不需要作为一个函数调用。

+0

我有麻烦了,我没有检查之前的帖子! [酷之前讨论] [1] [1]:http://stackoverflow.com/questions/6349121/choosing-an-oop-pattern-in-javascript –

回答

3

用的WebKit(Safari浏览器,Chrome浏览器)或Firefox的最新版本,您可以define getter and setter functions

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

如何:

var Car = function(thevendor, themodel, theyear) { 
    this.vendor = thevendor; 
    this.model = themodel, 
    this.year = theyear, 
    this.name = function() { 
      return this.vendor + " " + this.model + " " + this.year; 
     }; 
    return this; 
}; 


var foo = new Car("Toyota","Corola",2007); 
alert(foo.name()); //alerts "Toyota Corola 2007" 

foo.vendor = "Mitubishi"; 
alert(foo.name()); //alerts "Mistubishi Corola 2007" 

的jsfiddle此代码:http://jsfiddle.net/duncan_m/gZKQD/

2

当您使用name: (function() {return vendor + " " + model + " " + year;})(),这意味着,name属性将被设置为执行此功能的结果。当您创建新的Car时会发生这种情况。但是,这听起来像你想这个动态更新,所以考虑让name是一个getter函数,而不是只是一个字符串属性:

name: function() {return vendor + " " + model + " " + year;}

然后,你可以做alert(taxi.name()),这将动态拼接的供应商,型号,和年份字符串。

+0

是否有可能不使'name'成为一个函数? –

+0

如果你想在不使'name'成为函数的情况下做到这一点,你必须设置setter函数(例如'setVendor','setModel'和'setYear'),以便每次改变时都可以重新创建'name' 。你也可以使用[getters and setters](https://developer.mozilla.org/en/Core_JavaScript_1。5_Guide/Working_with_Objects#Defining_Getters_and_Setters)作为另一位评论者提到。 – jtbandes