JavaScript中的多态性具有不同的构造函数

Polymorphism in JavaScript to have different constructors

本文关键字:构造函数 多态性 JavaScript      更新时间:2023-09-26

我是JavaScript的新手,我一直在Java和C++中工作,在那里我们有构造函数的多态性;示例:

class Car
{
     Car()
     {
         ....
         //body
         ....
     }
     Car(int speed, string body_type)
     {
          ....
          //body
          ....
     }
};

我尝试使用相同的概念在JavaScript中进行面向对象编程。我写了这个代码:

<html>
<head>
    <script type="text/javascript">
    function bike()
    {
        this.bike_type="scooter";
    this.bike_bidy="metal";
        this.bike_speed=40;
        document.write('bike instantiated with type:'+this.bike_type);  
    }
    function bike(type, body, speed)
    {
        this.bike_type=type;
        this.bike_bidy=body;
        this.bike_speed=speed;
        document.write('bike instantiated with type:'+type);    
    }
    bike1 = new bike("harley","metal",120);
    bike2 = new bike();
    document.write(bike1.bike_type);
    document.write(bike2.bike_speed);
</script>
</head>
<body>
</body>
</html>

但在这里,我只得到了bike()函数/class的实例,而没有得到bike(type, body, speed)的实例。当我尝试这个:

<html>
<head>
    <script type="text/javascript">
    function bike(type, body, speed)
    {
        this.bike_type=type;
        this.bike_bidy=body;
        this.bike_speed=speed;
        document.write('bike instantiated with type:'+type);    
    }
    function bike()
    {
        this.bike_type="scooter";
    this.bike_bidy="metal";
        this.bike_speed=40;
        document.write('bike instantiated with type:'+this.bike_type);  
    }
    bike1 = new bike("harley","metal",120);
    bike2 = new bike();
    document.write(bike1.bike_type);
    document.write(bike2.bike_speed);
</script>
</head>
<body>
</body>
</html>

然后我得到,例如function bike(type, body, speed),而不是bike()。我知道这只是第一个定义。我现在的做法是不允许的。

如何在JavaScript中创建多态构造函数?有可能吗?

在Javascript中:

  • 全局函数只能定义一次
  • 函数参数是可选的
  • 函数参数可通过名为arguments的伪数组获得(请参阅文档)

所以你可以这样做:

function bike(type, body, speed)
{
    if (arguments.length >= 3) {
        this.bike_type = type;
        this.bike_body = body;
        this.bike_speed = speed;
        document.write('bike instantiated with type:'+type);    
    } else {
        this.bike_type = "scooter";
        this.bike_body = "metal";
        this.bike_speed = 40;
        document.write('bike instantiated with type:'+this.bike_type);  
    }
}

不,这是不可能的。在这两种情况下,第二个函数定义都会覆盖第一个。

你必须从你的函数内部检查你的论点,并相应地改变你的函数行为。

在您的情况下,如果没有提供默认值,您可以简单地使用:

function bike(type, body, speed)
{
    this.bike_type = type || "scooter";
    this.bike_bidy = body || "metal";
    this.bike_speed = speed || 40;
}

使用单个选项参数(如bike({body: "carbon fiber"}))也是非常常见的,它允许您省略前导参数,而不必在它们的位置指定undefined

function bike(options)
{
    this.bike_type = options.type || "scooter";
    // ...
}