JS++ |构造函数
在我们的 cat 示例中,我们已经能够实例化我们的 cat 并单独提供一个名称。但是,可能需要在实例化时要求给猫命名,这样我们就不会意外忘记给猫命名。构造函数允许我们控制实例化。
默认情况下,JS++ 为您提供了一个构造函数。这被称为“默认构造函数”。如果您没有明确定义的任何构造函数,则它由 JS++ 隐式定义。默认构造函数不带参数,只返回类的新实例。要理解默认构造函数,我们可以显式定义它:
external $;
module Animals
{
class Cat
{
string _name;
var $element = $(
"""
"""
);
Cat() {
}
property string name() {
return _name;
}
property void name(string name) {
_name = name;
}
void render() {
$element.attr("title", _name);
$("#content").append($element);
}
}
}
如果您尝试编译项目,应该没有问题。原因是因为我们在 main.jspp 文件中实例化了没有参数的“Cat”类。如果您尝试提供一些参数,您将收到错误代码的编译错误。
从我们显式定义的默认构造函数中可以看出,构造函数没有参数。此外,它什么也不做。 (没有操作的构造函数仍将返回该类的新实例。构造函数中的显式“返回”语句是不必要的,也是不允许的,因为构造函数总是返回该类的新实例。)
构造函数的一种特殊用途是将字段初始化为自定义值。现在,如果您实例化“Cat”类,您将获得“_name”字段作为空字符串。如果我们希望“Cat”的实例总是有一个名称,我们必须在实例化期间通过指定构造函数来要求它。
首先,删除 getter 和 setter 方法。其次,将我们定义的显式构造函数更改为采用一个参数:猫名的“字符串”。最后,将该字段初始化为提供给构造函数的参数。 (你现在应该知道如何做到这一点了。)
Cat.jspp 中的代码现在应该如下所示:
external $;
module Animals
{
class Cat
{
string _name;
var $element = $(
"""
"""
);
Cat(string name) {
_name = name;
}
void render() {
$element.attr("title", _name);
$("#content").append($element);
}
}
}
接下来,我们必须更改 main.jspp:
import Animals;
Cat cat1 = new Cat("Kitty");
cat1.render();
Cat cat2 = new Cat("Kat");
cat2.render();
编译项目。在您的网络浏览器中打开 index.html。你应该再次看到那两只猫。将鼠标悬停在他们的图像上。你应该再次看到他们的名字。
请务必注意,不再定义隐式定义的默认构造函数(采用零参数)。一旦为类显式定义了构造函数,就不会显式定义默认构造函数。因此,现在实例化我们的“Cat”类的唯一方法是使用需要名称的构造函数。如果您尝试更改 main.jspp 中的代码以实例化具有零参数的类,您将收到编译错误。