考虑以下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抱怨在Car构造函数中,变量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);
答案 0 :(得分:1)
是的,它们可以具有相同的名称。函数参数与函数的局部变量位于同一名称空间中,但对象本身的属性完全不同。
您可以将参数和局部变量视为本地范围对象(或范围链)上的项目,而当前对象的属性是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/