我是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";
// ...
}