无法从其类未声明的对象中读取私有成员 #form [duplicate]

Cannot read private member #form from an object whose class did not declare it [duplicate]

提问人:Uchenna Ajah 提问时间:3/19/2023 最后编辑:Uchenna Ajah 更新时间:3/19/2023 访问量:477

问:

我无法访问用作已提交事件参数的私有方法。现在的使用指向形式,而不是类本身。在 JavaScript 中引用类的最简单方法是什么,而不考虑对象深度或闭包?this

class payment {
    
    #form;
    
    constructor() {
        this.#form = $('#code-form').get(0);
        this.#form.addEventListener('submit', this.#submitForm);
    }

    
    #submitForm(e) {
        e.preventDefault(); 
        console.log( this.#form ); // Cannot read private member #form from an object whose class did not declare it
    }

}

(new payment());
JavaScript 关闭 私有

评论

0赞 Uchenna Ajah 3/19/2023
@MisterJojo - 通过使用 ,应该不难知道这是一个元素!addEventListener('submit', x)$('#code-form')<form>
0赞 Uchenna Ajah 3/19/2023
@MisterJojo - 这里的问题不在于 .即使表单只包含一个提交按钮而没有其他内容,它仍然实现了其目的。形式没有什么奇怪的。您应该关注的问题是关键字以及它如何指向类<form>thispayment
0赞 Uchenna Ajah 3/19/2023
@MisterJojo - 我已经编辑了代码!这不需要太多的问题或重新编辑代码。即使从最少的代码中也可以清楚地看到问题
0赞 Mister Jojo 3/19/2023
我对这种事情没有想象力,你会为此责怪我吗?另一方面,与您不同,我知道如何使用调试器。
0赞 Nick Parsons 3/19/2023
而不是 ,这样做会保留正确的上下文(有关详细信息,请参阅重复)'submit', this.#submitForm'submit', (e) => this.#submitForm(e)this

答:

1赞 Vanortton 3/19/2023 #1

您可以在构造函数中使用,也可以在添加事件侦听器 1 时使用。bind

下面是使用 bind 的示例:

class payment {
    #form;

    constructor() {
        this.#form = $('#code-form').get(0);
        this.submitForm = this.submitForm.bind(this);
        this.#form.addEventListener('submit', this.submitForm);
    }

    submitForm(e) {
        e.preventDefault();
        console.log(this.#form);
    }
}

(new payment());
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Example</title>
    <script src="https://code.jquery.com/jquery-latest.min.js"></script>
</head>

<body>
    <form id="code-form">
        <button type="submit"></button>
    </form>
</body>

</html>

评论

0赞 Uchenna Ajah 3/19/2023
我刚刚尝试了上面的代码并收到以下错误 - 私人方法“#submitForm”在新付款时不可写。
1赞 Uchenna Ajah 3/19/2023
但是,我尝试通过删除该方法,如果该方法公开,它可以正常工作。#submitForm
0赞 Vanortton 3/19/2023
我做了一个编辑,现在再试一次。
0赞 Uchenna Ajah 3/19/2023
现在,当该方法公开时,它就可以工作了。谢谢submitForm