📜  JS++ |构造函数

📅  最后修改于: 2022-05-13 01:55:41.018000             🧑  作者: Mango

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 中的代码以实例化具有零参数的类,您将收到编译错误。