是否需要在类构造函数中声明所有成员

时间:2019-04-26 21:55:50

标签: javascript

以下两个类声明本质上是相同的吗?

class ColorSpectrum
{
    constructor(min, max)
    {
        this.Min = min;
        this.Max = max;
        //this.Colors = []; edited
        this.Colors;
    }

    SetColors(colors)
    {
        this.Colors = colors;
    }
}

vs

class ColorSpectrum
{
    constructor(min, max)
    {
        this.Min = min;
        this.Max = max;
    }

    SetColors(colors)
    {
        this.Colors = colors;
    }
}

如果我理解正确,那么在Colors的实例中尚未调用undefined的情况下,两种情况下的SetColors都将是ColorSpectrum

从广义上讲,我是否需要在构造函数中明确声明我的类的所有成员,或者可以在不同成员中“即时”定义它们(例如上面示例中的SetColors)? / p>

3 个答案:

答案 0 :(得分:0)

  

如果我理解正确,在两种情况下,如果尚未在ColorSpectrum实例中调用SetColors,则颜色将不确定。

我们检查一下。

class ColorSpectrum {
  constructor(min, max) {
    this.Min = min;
    this.Max = max;
    this.Colors = [];
  }

  SetColors(colors) {
    this.Colors = colors;
  }
}

class ColorSpectrum2 {
  constructor(min, max) {
    this.Min = min;
    this.Max = max;
  }

  SetColors(colors) {
    this.Colors = colors;
  }
}

const spectrum1 = new ColorSpectrum(0, 1);
const spectrum2 = new ColorSpectrum2(0, 1);

console.log(spectrum1.Colors);
console.log(spectrum2.Colors);

不。

顺便说一句,这是大写类名的通用约定,但小写属性和方法。因此:class ColorSpectrum,但this.minthis.maxsetColors

答案 1 :(得分:0)

这取决于ColorSpectrum尚未初始化时Colors是否有效。 在任何语言中,当构造函数返回时,对象都应处于有效且可用的状态。因此,构造函数是否需要初始化所有字段取决于确切构成特定类的有效状态的因素。

答案 2 :(得分:0)

您不必在构造函数中声明所有成员,但是如果没有,则需要为未定义的值做好准备。您的示例很好地说明了这一点,因为它们不相同:

class ColorSpectrum_one {
  constructor(min, max) {
    this.Min = min;
    this.Max = max;
    this.Colors = [];
  }

  SetColors(colors) {
    this.Colors = colors;
  }
}


class ColorSpectrum_two {
  constructor(min, max) {
    this.Min = min;
    this.Max = max;
  }

  SetColors(colors) {
    this.Colors = colors;
  }
}

let c1 = new ColorSpectrum_one()
c1.Colors.push("some color") // no problem
console.log(c1.Colors)

let c2 = new ColorSpectrum_two()
try {
  c2.Colors.push("some color") // error undefined.
} catch (err) {
  console.log("error: ", err.message)
}

在这种情况下,如果您知道this.Colors将是一个数组,则在构造函数中声明它很有意义。无需这样做,本质上要求您在使用此类之前调用​​SetColors,如果是这种情况,它应该是构造函数的一部分。

此外,从可用性的角度来看,很高兴能够查看类的构造函数并快速查看期望的属性。