为什么ES6类中无法实现本地功能?

时间:2016-07-25 19:46:12

标签: javascript ecmascript-6

在ES6中遗漏了类似的东西是什么意思:

class Foo {
   myMethod(){
      // do something with 'bar'
   }
   constructor(){
       this.myMethod();
   }
   otherMethod(){
       this.myMethod();
   }
}

我知道可以在构造函数中或类外部定义函数,然后将其与myMethod()一起使用。然而,来自其他语言我很惊讶地看到了类,但没有本地(或私有)方法。我在互联网上找不到关于这个被遗漏的原因。

1 个答案:

答案 0 :(得分:1)

修改 我刚刚意识到你的帖子是关于函数,而不是变量。由于函数是一种变量,所有这些解决方案都适用于函数,即使我没有明确地生成示例函数

<小时/> 我找到了几种解决方案,每种解决方案各有利弊:

方法0:工厂

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());

利用JS范围隐藏变量priv隐藏在函数

之后

优点:

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

缺点:

  • 它不是很清晰或可读

方法1:定义构造函数

中的所有内容
class Foo2 {
  constructor(num) {
    Object.assign(this, {
      test() {
        return num;
      }
    });
  }
}

var b = new Foo2(262);

console.log(b.test());

正如它在盒子上所说的那样。

优点:

  • 再次完全安全。无法从范围之外访问本地变量
  • 比方法1更具可读性。一切都很明显
  • 私有变量不会与父类冲突

缺点:

  • 阻塞构造函数
  • 仍然不太可读

方法2:命名约定

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

var c = new Foo3(101);

console.log(c.test());

无需隐藏在奇怪的安全程序背后。只需在名称中指定哪些属性为“私有”

优点:

  • 非常容易阅读,可以利用班级结构

缺点:

  • 绝对不提供保护,仅提供建议。
  • 私有变量与父类的私有变量冲突

方法3:符号

const eh = Symbol("eh");

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

var d = new Foo4(100);

console.log(d.test());

我只是想包含这个,因为我认为它很酷

优点:

  • 可读作为命名约定。私有变量没有字符串,他们得到符号。非常容易阅读

缺点:

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

希望这有用!