JavaScript对象 - '静态初始化'

7

我正在将一些Java代码转换为Javascript,而Java对象具有静态初始化块,在对象中填充两个数组。我的理解是,无论创建多少个对象,此初始化程序仅运行一次。在Javascript中我能做到这样的事情吗?

Java代码:

    public final class MyObject {

        private MyObject() { }

        // ...

    static {
             // Run once static init code here
    }

}

这种只运行一次的初始化在Javascript中能够实现吗?

谢谢


你是如何在JavaScript中定义类的? - Maz
1
将Java代码转换为JavaScript? 嗯? 它们的用例完全不同... 请记住,JavaScript不是Java的子集,超集甚至交集。 它们只共享前4个字母。 - Byron Whitlock
1
好的,我有一些使用Java编写的代码,我也想在JavaScript中完成。在JavaScript中,我的类定义如下:function MyClass() { this.name = ""; }MyClass.prototype.doStuff = new function(a,b) { ... } - Jason
静态代码在创建第一个实例时运行吗? - gblazex
1
@galambalazs 是的,这就是我想要的。只需要一个在第一次创建实例时运行的函数,并在所有后续实例化中被忽略。我知道我可以使用全局标志来实现一些笨拙的解决方案,但肯定有更简洁的方法。 - Jason
4个回答

7

是的,ES6 类有一些技巧。

class MyClass {

    static #unused = MyClass.#init();

    static #init() {
        // Your initialization logic
    }
}

6

不完全是这样。

“静态”成员的整个概念在JavaScript中并不适用。您可以以“公共”的方式实现它们。

这种方法可以实现您所要求的功能,但实际上只是一堆笨拙的语法,其本质是“通过构造函数触发一次运行此函数”的方式。

function MyObject()
{
  if ( 'undefined' == typeof MyObject.__initialized )
  {
    // static stuff
    alert( 'hi' );

    MyObject.__initialized = true;
  }

  // Proceed with constructing instance of MyObject
}

new MyObject();
new MyObject();

@Peter,这个解决方案与工作线程互动良好吗? - Pacerier

4
// Object Contructor
function MyObject(name) {

  if (!this.done) {
    this.done = true;
    // init stuff
    // ...
  }

  this.name = name;
  return this; // optional
}

// available in all instances
MyObject.prototype.done = false;

1

是的,现在可以使用ES2022的类静态初始化块功能实现:

class MyObject {
    static {
        // logic
    }
}

谢谢,它也支持继承吗? - kungfooman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接