Chrome 在JavaScript中,父类的私有变量可以在子类中访问

moiiocjp  于 2023-04-03  发布在  Go
关注(0)|答案(1)|浏览(156)
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的详细解释和示例。

hk8txs48

hk8txs481#

为什么父类的私有变量可以在JavaScript的子类中访问?
问题1的代码中没有任何内容可以做到这一点,如果您实际尝试,它不会工作:

class Parent {
    #privateField = 42;
}

class Child extends Parent {
    method() {
        console.log(this.#privateField); // SyntaxError: Private field '#privateField' must be declared in an enclosing class
    }
}

您已经显示了//Object { #privateField: 42, #subPrivateField: 23 },这表明您正在控制台中执行此操作。所显示的是由new SubClass创建的对象中包含两个private字段。它确实如此,因为该对象既是SubClass的示例**,又是ClassWithPrivateField的示例**。但这并不意味着SubClass的代码可以访问#privateField
问题2 -在Chrome浏览器中,我可以访问私有变量,而在Firefox浏览器中,我无法访问私有变量。
这是Chrome devtools的一个特性(最近在111版本中引入的一个),它可以让你做一些调试辅助工具。Devtools可以让你做一些你不能做的事情。这既不是Chrome的bug(你可以做),也不是Firefox的bug(你不能做),只是在他们的调试环境中有不同的选择/功能集。
一般来说,不要过多地阅读你在devtools中能做什么和不能做什么。如果你想知道某些东西在真实的代码中是否有效,那就在真实的代码中尝试一下。

相关问题