【问题标题】:Same variablename and propertyname in a constructor in JavaScriptJavaScript 构造函数中的相同变量名和属性名
【发布时间】:2014-05-18 06:19:38
【问题描述】:

考虑以下 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 未使用。当我输入redCar. 时,它也不会提示hasWheels。这适用于属性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);

【问题讨论】:

  • 这听起来像是 NetBeans 的问题。

标签: javascript class variables properties constructor


【解决方案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/

【讨论】:

  • 不是代码不行。相反,如果我这样写,NetBeans 将无法识别该属性。所以我想知道它是否有“问题”。但也许这里的 NetBeans 出了点问题……令人惊讶的是,NetBeans 并没有抱怨 color 属性……
  • @Daniel - 从 Javascript 的角度来看,它没有任何问题,所以问题完全出在 NetBeans 上。您必须决定是否要让 NetBeans 满意,但没有理由改变它。
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2017-03-01
  • 2014-12-14
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多