考虑JavaScript中类的以下定义:
// Car constructor
function Car(color) {
var hasWheels = true;
this.color = color;
this.hasWheels = hasWheels;
}
var redCar = new Car('red');
console.log(redCar.hasWheels);它看起来很有效,因为它在Firefox中没有错误,并且将true写到控制台。但是,这段代码是正确的还是JavaScript太宽容了?Netbeans抱怨说,在汽车构造函数中,变量hasWheels未使用。而且,当我键入hasWheels时,它不会给redCar.提供任何提示。这与属性color一起正常工作。那么,我必须将变量hasWheels重命名为_hasWheels吗?(我知道在这个简单的例子中,我可以直接将属性hasWeels设置为true,但这不是我问题的重点。)因此,新代码看起来应该是:
// Car constructor
function Car(color) {
var _hasWheels = true;
this.color = color;
this.hasWheels = _hasWheels;
}
var redCar = new Car('red');
console.log(redCar.hasWheels);对于NetBeans来说,这似乎很好。但是,我更喜欢将属性和变量命名为相同的名称,因为它们位于指定的末尾。而且,构造函数最后一行中的this['hasWheels'] = hasWheels似乎不起作用。
至于它的价值,这在NetBeans中工作得很好:
function Car(color) {
var hasWheels = true;
return {
color: color,
hasWheels: hasWheels
};
}
var redCar = new Car('red');
console.log(redCar.hasWheels);发布于 2014-05-18 06:25:38
是的,他们可以有相同的名字。函数参数与函数的局部变量位于同一个名称空间中,但对象本身的属性完全不同。
您可以将参数和局部变量视为本地作用域对象(或范围链)上的项,而当前对象的属性是this指向的对象的属性。这两个名称空间是不同的。达到一个没有像color那样的限定符。另一个只能通过引用对象来实现,就像在this.color中一样。因此,this.color = color工作得很好--将一个变量的值从一个名称空间分配给另一个对象名称空间中的属性--两个完全独立的变量。
在您所说的不起作用的示例中:
// Car constructor
function Car(color) {
var hasWheels = true;
this.color = color;
this.hasWheels = hasWheels;
}这里也不应该有任何问题,而且它似乎在这里运行得很好:http://jsfiddle.net/jfriend00/7PSg9/
https://stackoverflow.com/questions/23719143
复制相似问题