📜  JS++ |静态成员和“应用程序全局”数据

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

JS++ |静态成员和“应用程序全局”数据

到目前为止,我们声明的所有字段和方法都属于类实例。静态成员也可以添加到类中。静态成员在程序启动时初始化,并且可用于类的所有实例。

例如,我们可能想要记录我们拥有的“动物”实例的数量。该数据不应该对一个或另一个“动物”实例是唯一的;它应该对所有动物都一样。让我们更改 Animal.jspp 以使用 'static' 修饰符实现此目的:

external $;

module Animals
{
    class Animal
    {
        protected var $element;
        private static unsigned int count = 0;

        protected Animal(string iconClassName) {
            string elementHTML = makeElementHTML(iconClassName);
            $element = $(elementHTML);

            Animal.count++;
        }

        public static unsigned int getCount() {
            return Animal.count;
        }

        public virtual void render() {
            $("#content").append($element);
        }

        private string makeElementHTML(string iconClassName) {
            string result = '
'; result += ''; result += "
"; return result; } } }

我们在“Animal”类中创建了一个新字段:“count”。它在程序启动时被初始化为零,因为它被标记为“静态”。从那里开始,在每次对“Animal”的构造函数调用(例如通过继承)时,我们使用 ++ 递增运算符将“count”静态字段递增一。我们通过“Animal.count”引用静态字段。我们实际上不需要将名称限定到这个程度,并且可以在类中使用“count”,但我的目的是展示如何通过类名而不是实例来访问“count”。最后,我们声明了一个 getCount() 方法,它返回静态字段的值。

转到 main.jspp 并使用 jQuery 将此计数呈现到网页:

import Animals;

external $;

Animal[] animals = [
    new Cat("Kitty"),
    new Cat("Kat"),
    new Dog("Fido"),
    new Panda(),
    new Rhino()
];

foreach(Animal animal in animals) {
    animal.render();
}

$("#content").append("

Number of animals: " + Animal.getCount().toString() + "

");

编译项目并打开 index.html。您现在应该在渲染动物后看到计数:

虽然我们在声明时展示了静态字段初始化,但还有另一种初始化静态字段的方法:静态构造函数。我们也可以将 Animal.jspp 更改为使用静态构造函数,如下所示:

external $;

module Animals
{
    class Animal
    {
        protected var $element;
        private static unsigned int count;

        protected Animal(string iconClassName) {
            string elementHTML = makeElementHTML(iconClassName);
            $element = $(elementHTML);

            Animal.count++;
        }

       static Animal() {
            Animal.count = 0;
        }

        public static unsigned int getCount() {
            return Animal.count;
        }

        public virtual void render() {
            $("#content").append($element);
        }

        private string makeElementHTML(string iconClassName) {
            string result = '
'; result += ''; result += "
"; return result; } } }

静态构造函数不接受任何参数,并且它们不能应用访问修饰符。它们将在应用程序启动时运行。在上面的代码中,“count”静态字段未在声明时初始化。相反,我们将“count”字段的初始化移至静态构造函数。

JS++ 没有 JavaScript 那样的“全局作用域”。相反,在 JavaScript 中可能泄漏到全局范围内的变量在 JS++ 中将改为“文件范围”,并且在声明的文件之外不可用。如果您想要“全局变量”,您可以使用静态成员获得一个称为“应用程序全局数据”的更安全的子集,并且它同样有用,没有全局变量的潜在问题(例如无意泄漏到其他程序或库)。下面是如何使用静态成员创建应用程序全局数据的示例:

module Application
{
    class Config
    {
        public static string hostname = "127.0.0.1";
        public static unsigned int port = 80;
    }
}

有关范围的更多信息,请参阅 JS++ 文档。