【问题标题】:Ignore default value of class when instantiating实例化时忽略类的默认值
【发布时间】:2020-04-06 01:05:36
【问题描述】:

下面是一个简单的 TypeScript 类和它的两个实例。通常,当您创建 Car 类的实例时,您应该能够将您自己的类属性值作为参数传递,就像使用“carName”一样。但是您在构造函数中看到我已经将默认值设置为“maxSpeed”。现在我的两个问题:

  1. 在“myCar”的实例中,如何告诉它传递构造函数中预定义的“265”的预定义 maxSpeed?像“this.maxSpeed”那样做会给我一个错误,但我没有办法解决它。
  2. 在“yourCar”的实例中,如何忽略/忽略 maxSpeed 的预定义标准值 265,并传递我自己的值,例如 311,即如下例所示?

我对编程和 OOP 非常陌生,目前对此知之甚少。

class Car {
  carName:string;
  maxSpeed:number;

  constructor(carName:string, maxSpeed:number) 
    {
      this.carName = carName;
      this.maxSpeed = 265;
    }
}

//How can I pass the predefined constructor-value? What is my mistake?
var myCar = new Car('Tesla X', this.maxSpeed);

//This should print "265":
console.log(myCar.maxSpeed);

//How can I break the rule of the predefined constructor-value and get this 311 printed in the console? It still prints me the 265.
var yourCar = new Car('Tesla X', 311);

//This should print "311":
console.log(yourCar.maxSpeed);

【问题讨论】:

    标签: typescript class oop parameters constructor


    【解决方案1】:

    假设在 maxSpeed 变量之后的 Class/constructor 中,我添加了第三个变量。然后将 maxSpeed 留空的解决方案将不再有效。那么合法/正确的方法是在所有没有默认值的变量之后将所有变量都设置为默认值吗?或者这种解决方法是否合法?通过使用“未定义”,它仍然会记录 maxSpeed = 265。

    `class Car {
      constructor(
        public carName: string, 
        public maxSpeed: number = 265,
        public someThing: string
        ) {}
    }
    
    const myCar = new Car('Tesla X', undefined, 'test');
    
    console.log(myCar);`
    

    【讨论】:

    • @jb-nizet 你认为这种使用 undefined 的方式合法吗?还是应该将所有具有默认值的变量始终放在类/构造函数的末尾?
    【解决方案2】:
    class Car {
      constructor(public carName: string, public maxSpeed: number = 265) {}
    }
    

    这就是你所需要的:

    • 参数可以定义默认值,允许在调用构造函数/函数时省略它们(maxSpeed 会这样做,所以你可以这样做const myCar = new Car('Tesla X');
    • 如果构造函数参数也是类的属性,您可以在构造函数参数之前使用可见性修饰符声明它。所以上面是压缩版的
    class Car {
      carName: string;
      maxSpeed: number;
    
      constructor(carName: string, maxSpeed: number = 265) {
        this.carName = carName;
        this.maxSpeed = maxSpeed;
      }
    }
    

    我会将carName 重命名为name。当然它是汽车名称,因为它是 Car 类的属性。所以car前缀是多余的。

    另外,永远不要使用var。使用const(如果不应重新分配变量)或let

    【讨论】:

    • 谢谢您,您的两种解决方案都运行良好!并感谢命名提示!
    • 你能告诉我为什么会出现构造函数参数不是类的属性的情况吗? (我是 OOP 和一般编程的新手)。我真的很想像你在答案的前三行中所做的那样编写课程,而不是像我在顶部问题中所做的那样。但是为什么它不能总是像你那样简洁呢?
    • 您始终可以使用紧凑的方式。只是不要将 public、protected 或 private 放在构造函数参数之前,它只是:构造函数参数,而不是属性?你为什么要那个?当您只需要一个参数来在构造函数中对其进行处理时。简单的例子:constructor(name: string) { this.name = (name || 'anonymous').toUpperCase(); }.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多