JS++ 构造函数
在我们的猫的例子中,我们已经能够将我们的猫实例化并单独提供一个名字。然而,我们可能希望在实例化时要求猫被命名,这样我们就不会意外地忘记给猫命名。构造函数允许我们控制实例化。
默认情况下,JS++为你提供一个构造器。这被称为 “默认构造函数”。如果你没有任何明确定义的构造函数,它就会被JS++隐式定义。默认构造函数不需要参数,只返回一个新的类的实例。为了理解默认构造函数,我们可以明确地定义它。
external ;
module Animals
{
class Cat
{
string _name;
varelement = (
"""
<div class="animal">
<i class="icofont icofont-animal-cat"></i>
</div>
"""
);
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’类,你会得到’_name’字段,它是一个空字符串。如果我们想让’Cat’的实例总是有一个名字,我们必须在实例化时通过指定一个构造函数来要求它。
首先,删除getter和setter方法。其次,将我们定义的显式构造函数改为接受一个参数:猫的名字的 “字符串”。最后,将该字段初始化为提供给构造函数的参数。(你现在应该知道怎么做了)。
你在Cat.jspp中的代码现在应该看起来像这样。
external ;
module Animals
{
class Cat
{
string _name;
varelement = (
"""
<div class="animal">
<i class="icofont icofont-animal-cat"></i>
</div>
"""
);
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。你应该再次看到那两只猫。将鼠标悬停在它们的图像上。你应该再一次看到它们的名字。
值得注意的是,隐式定义的默认构造函数(需要零参数)不再被定义。一旦你为一个类明确地定义了一个构造函数,默认的构造函数就不会被明确地定义。因此,现在实例化我们的 “猫 “类的唯一方法是使用需要名字的构造函数。如果你试图改变main.jspp中的代码来实例化一个零参数的类,你会得到一个编译错误。