Javascript 为什么ES6类中不可能使用本地函数?
在ES6中省略类似内容的想法是什么:Javascript 为什么ES6类中不可能使用本地函数?,javascript,ecmascript-6,Javascript,Ecmascript 6,在ES6中省略类似内容的想法是什么: class Foo { myMethod(){ // do something with 'bar' } constructor(){ this.myMethod(); } otherMethod(){ this.myMethod(); } } 我知道可以在构造函数中或类外定义函数,然后将其与myMethod()一起使用。然而,来自其他语言的我惊讶地看到类,但没有本地(或私有)方法
class Foo {
myMethod(){
// do something with 'bar'
}
constructor(){
this.myMethod();
}
otherMethod(){
this.myMethod();
}
}
我知道可以在构造函数中或类外定义函数,然后将其与myMethod()
一起使用。然而,来自其他语言的我惊讶地看到类,但没有本地(或私有)方法。我在互联网上找不到任何关于此内容被遗漏原因的信息。编辑:
我刚意识到你的帖子是关于函数的,不是关于变量的。因为函数是一种变量,所以所有这些解决方案都适用于函数,即使我没有显式地制作示例函数
我找到了几种解决方案,每种方案都有其优缺点: 方法0:工厂 利用JS作用域将变量
priv
隐藏在函数后面
优点:
- 非常安全。除非返回priv的指针,否则基本上不可能访问priv
- 利用了一个使用良好的javascript范例。工厂已经被程序员使用了一年了
- 私有变量与父类不冲突
- 它不是很清楚也不可读
方法1:从构造函数定义所有内容 就像盒子上写的那样 优点:
- 又完全安全了。无法从范围外访问局部变量
- 比方法1更具可读性。很明显,每件事都是这样的
- 私有变量与父类不冲突
- 阻塞构造函数函数
- 还是不太可读
方法2:命名约定 没有必要躲在奇怪的安全程序后面。只需在名称中指定哪些属性是“私有的” 优点:
- 非常容易阅读,可以利用类结构
- 绝对不提供保护,只提供建议
- 私有变量与父类的私有变量冲突
- 作为命名约定可读。私有变量不获取字符串,而是获取符号。非常容易阅读
- 毫无意义。在父作用域受到保护的任何情况下,您都可以将私有变量存储在那里
- 不安全。即使您解决了上述问题,人们也可以使用
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());