如何从 javascript es6 中的静态方法访问私有字段?

问题描述 投票:0回答:5

我希望在 JavaScript 中创建一个既私有又静态的函数。有办法做到吗?

我通过实践知道

#myfunc = function() {

}

我可以将其设为私有。但是当我尝试从标记为静态的函数访问它时,我得到了

(节点:15092)UnhandledPromiseRejectionWarning:TypeError:无法从类未声明的对象中读取私有成员#myfunc

我该如何修复它?

javascript
5个回答
3
投票

据我所知,当前的 ecmascript 版本无法定义私有静态方法。但是您可以通过在类外部但在同一文件内声明函数来模拟静态方法。

虽然您不从该文件中导出该函数,但它的工作方式与私有静态方法相同,但调用方式不同。

这是一种使用当前 javascript 规范实现相同行为的方法。

// MyFile.js

function myPrivateMethod() {} // You won't have access to this function outside this file

export class MyClass {
   myMethod() {
     myPrivateMethod();
   }
}

如果要访问静态属性,只需调用MyClass.myStaticProperty即可。在这种情况下,我建议您在类定义之后定义函数,以避免提升问题。


2
投票

您不能将静态属性设为私有或其他可访问性。因为,它默认是公开的,而且总是正确的

不可能指定静态的可访问性——它们实际上总是公开的。


2
投票

我希望在 JavaScript 中创建一个既私有又静态的函数。

这是不可能的,因为静态属性是类对象中的属性(您用

new
调用的属性)。因此,如果有人有权访问类对象,他们就可以访问任何静态属性。

但是,您可以使用常规函数来替换它。您甚至可以创建一个包含私有“静态”函数的对象并从该对象调用它们。


0
投票

您可以通过将类定义嵌入到函数中来简单地模拟私有静态属性,并在声明类之前使用 let 语句来使用和声明私有静态属性。这些变量在您的班级中可见,但在其他地方不可见。

     let _myPrivate = 123;  // variable exist the whole lifetime of the page.
     MyClass = class {
       get myPrivate() { return _myPrivate; }     // returns 123
     }

0
投票

但是当我尝试从标记为静态的函数访问它时

当您创建

static
成员时,它与底层
class
相关联,而不是与实例相关联。如果您想从静态方法访问私有成员,您还需要将该成员标记为
static

class Thing {
  static #myfunc = function () {}
  static method () {
    this.#myfunc()
  } 
}

Thing.method()

这是一个示例,演示静态方法如何访问实例的静态字段和私有字段:

class Thing {
    #prop
    constructor(prop) {
      this.#prop = prop
    }
    static #field = 'static field'
    static #myfunc = function (aThing) {
      console.log(`I can only access a ${this.#field} or private fields of an ${aThing.#prop}`)
    }
    static method(aThing) {
      this.#myfunc(aThing)
    }
  }

  Thing.method(new Thing('instance'))
  console.log(Thing.myfunc) // undefined

© www.soinside.com 2019 - 2024. All rights reserved.