gpt4 book ai didi

javascript - 为什么局部函数在 ES6 类中是不可能的?

转载 作者:行者123 更新时间:2023-11-29 15:26:41 25 4
gpt4 key购买 nike

在 ES6 中遗漏这样的东西是什么想法:

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

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

最佳答案

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


我找到了几种解决方案,每种都各有利弊:

方法 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 隐藏在函数后面

优点:

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

缺点:

  • 不是很清楚或可读

方法一:在构造函数中定义一切

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

var b = new Foo2(262);

console.log(b.test());

正如包装盒上所说的那样。

优点:

  • 再次完全安全。无法从作用域外访问局部变量
  • 比方法 1 更具可读性。一切都做了什么有点明显
  • 私有(private)变量不与父类冲突

缺点:

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

方法二:命名约定

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

var c = new Foo3(101);

console.log(c.test());

无需躲在奇怪的安全程序后面。只需在名称中指定哪些属性是“私有(private)的”

优点:

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

缺点:

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

方法三:符号

const eh = Symbol("eh");

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

var d = new Foo4(100);

console.log(d.test());

我只是想包括这个,因为我觉得它很酷

优点:

  • 作为命名约定可读。私有(private)变量不获取字符串,它们获取符号。非常容易阅读

缺点:

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

希望这对您有所帮助!

关于javascript - 为什么局部函数在 ES6 类中是不可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38576191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com