class ClassWithPrivateField {
#privateField;
constructor() {
this.#privateField = 42;
}
}
class SubClass extends ClassWithPrivateField {
#subPrivateField;
constructor() {
super();
this.#subPrivateField = 23;
}
}
new SubClass();
//Object { #privateField: 42, #subPrivateField: 23 }
问题1 -为什么父类私有变量可以在JavaScript的子类中访问。
问题在Chrome和Firefox中复制。
MDN - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields
这是Chrome浏览器和Firefox浏览器中的一个bug吗?
问题2 -在Chrome浏览器中,我可以访问私有变量,而在Firefox浏览器中,我无法访问私有变量。
在上例中:
var subClass = new SubClass();
subClass.##privateField; //value is printing in chrome and Firefox is throwing "Uncaught SyntaxError: reference to undeclared private field or method #privateField".
这是Chrome浏览器的bug吗?
请提供问题1和问题2的详细解释和示例。
1条答案
按热度按时间hk8txs481#
为什么父类的私有变量可以在JavaScript的子类中访问?
问题1的代码中没有任何内容可以做到这一点,如果您实际尝试,它不会工作:
您已经显示了
//Object { #privateField: 42, #subPrivateField: 23 }
,这表明您正在控制台中执行此操作。所显示的是由new SubClass
创建的对象中包含两个private字段。它确实如此,因为该对象既是SubClass
的示例**,又是ClassWithPrivateField
的示例**。但这并不意味着SubClass
的代码可以访问#privateField
。问题2 -在Chrome浏览器中,我可以访问私有变量,而在Firefox浏览器中,我无法访问私有变量。
这是Chrome devtools的一个特性(最近在111版本中引入的一个),它可以让你做一些调试辅助工具。Devtools可以让你做一些你不能做的事情。这既不是Chrome的bug(你可以做),也不是Firefox的bug(你不能做),只是在他们的调试环境中有不同的选择/功能集。
一般来说,不要过多地阅读你在devtools中能做什么和不能做什么。如果你想知道某些东西在真实的代码中是否有效,那就在真实的代码中尝试一下。