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++ 文档。