Javascript 为什么ES6类中不可能使用本地函数?

Javascript 为什么ES6类中不可能使用本地函数?,javascript,ecmascript-6,Javascript,Ecmascript 6,在ES6中省略类似内容的想法是什么: class Foo { myMethod(){ // do something with 'bar' } constructor(){ this.myMethod(); } otherMethod(){ this.myMethod(); } } 我知道可以在构造函数中或类外定义函数,然后将其与myMethod()一起使用。然而,来自其他语言的我惊讶地看到类,但没有本地(或私有)方法

在ES6中省略类似内容的想法是什么:

class Foo {
   myMethod(){
      // do something with 'bar'
   }
   constructor(){
       this.myMethod();
   }
   otherMethod(){
       this.myMethod();
   }
}
我知道可以在构造函数中或类外定义函数,然后将其与
myMethod()
一起使用。然而,来自其他语言的我惊讶地看到类,但没有本地(或私有)方法。我在互联网上找不到任何关于此内容被遗漏原因的信息。

编辑: 我刚意识到你的帖子是关于函数的,不是关于变量的。因为函数是一种变量,所以所有这些解决方案都适用于函数,即使我没有显式地制作示例函数
我找到了几种解决方案,每种方案都有其优缺点:

方法0:工厂 利用JS作用域将变量
priv
隐藏在函数后面

优点:

  • 非常安全。除非返回priv的指针,否则基本上不可能访问priv
  • 利用了一个使用良好的javascript范例。工厂已经被程序员使用了一年了
    • 私有变量与父类不冲突
缺点:

  • 它不是很清楚也不可读

方法1:从构造函数定义所有内容 就像盒子上写的那样

优点:

  • 又完全安全了。无法从范围外访问局部变量
  • 比方法1更具可读性。很明显,每件事都是这样的
  • 私有变量与父类不冲突
缺点:

  • 阻塞构造函数函数
  • 还是不太可读

方法2:命名约定 没有必要躲在奇怪的安全程序后面。只需在名称中指定哪些属性是“私有的”

优点:

  • 非常容易阅读,可以利用类结构
缺点:

  • 绝对不提供保护,只提供建议
  • 私有变量与父类的私有变量冲突
方法3:符号 我只是想把这个包括进去,因为我觉得它很酷

优点:

  • 作为命名约定可读。私有变量不获取字符串,而是获取符号。非常容易阅读
缺点:

  • 毫无意义。在父作用域受到保护的任何情况下,您都可以将私有变量存储在那里
    • 不安全。即使您解决了上述问题,人们也可以使用
      Reflect.ownKeys()

希望这是有帮助的

>来自其他语言时,我惊讶地发现类EcmaScript并没有每个说的类。如果你来自另一种语言,你应该仔细阅读原型。ES6类大多只是语法糖。JavaScript没有私有属性/方法,类语法只是原型继承的糖。@注释:好的,所以它们不是“真正的类”。谢谢。你可以使用TypeScript,它有私有和受保护的东西(不过只是编译时检查)。这是因为JS基于引用的安全模型:没有函数所有权,因为所有东西都是动态的(并且可以调用/应用/绑定)。因此,保护隐私的唯一方法是隐藏参考文献,如果这些参考文献坐在课堂上,任何人都可以找到它们。增加传统的私家车需要大量的通话时间检查;速度慢且不需要,因为受保护的方法/getter/setter可以提供隐私。
var Foo = (function() {
  let priv = {
    "eh": 0
  };
  return class Foo {
    constructor(num) {
      priv.eh = num;
    }
    test() {
      return priv.eh;
    }
  };
})();

var a = new Foo(383);

console.log(a.test());
class Foo2 {
  constructor(num) {
    Object.assign(this, {
      test() {
        return num;
      }
    });
  }
}

var b = new Foo2(262);

console.log(b.test());
class Foo3 {
  constructor(num) {
    this._eh = num;
  }
  test() {
    return this._eh;
  }
}

var c = new Foo3(101);

console.log(c.test());
const eh = Symbol("eh");

class Foo4 {
  constructor(num) {
    this[eh] = num;
  }
  test() {
    return this[eh];
  }
}

var d = new Foo4(100);

console.log(d.test());