簡體   English   中英

在 JavaScript 中創建類 onclick 的新實例的正確方法是什么?

[英]What is the proper way of creating a new instance of a class onclick in JavaScript?

類示例:

$(document).ready(function(){

    var $ = function(id)
    {
        return document.getElementById(id);
    }

    class someClass
    {
        constructor()
        {
            ...
        }
        someMethod()
        {
            ...
        }
    }
... // rest of examples within this scope
});

到目前為止,我能夠創建該類對象的實例,當窗口加載,然后調用這個類的方法上的一個按鈕點擊事件,同時還結合this

var obj = new someClass()
$('startButton').onclick = obj.someMethod.bind(obj)

一切正常,直到我想通過刪除和創建該類對象的新實例來重置。 我嘗試了幾種不同的方法:

首先,我嘗試在單擊按鈕時調用一個函數,該函數執行的任務比以前多(實例化一個新對象)。 我想這都與聲明變量obj在全球范圍內指定var的類型,並將其分配給null ,然后嘗試重新分配,並綁定this對按鈕的點擊。 這一直有效,直到我嘗試調用我的setup()方法:

$('startButton').onclick = function() {
    var obj = new someClass();
    var obj.setup.bind(obj); // fails to call
}

然后我嘗試了另一條路線,這或多或少讓我落在了同一個地方:

$('startButton').addEventListener('click', function(event) {
    var obj = new someClass();
    console.log('obj is an instance of someClass?', obj instanceof someClass); // returns true
    obj.setup.bind(obj); // fails to call
});

如果沒有在someClass中創建一個新方法來手動將我的所有類屬性重置回初始值(我寧願重新調用構造函數),我如何在按鈕單擊時優雅地實例化一個新類對象能夠綁定this ?

當我這樣做時,是否可以重新分配保存類對象的變量而不先將其標記為 GC 或以某種方式解除分配? 沒有其他內容引用它。 如果我的術語關閉,請提前道歉,我是新手。

obj.setup.bind(obj)將上下文綁定到函數,但不調用它。 你要么需要調用它:

obj.setup.bind(obj)();

或者使用.call()而不是.bind()

obj.setup.call(obj);

但是在這種情況下,由於您直接在實例上調用該方法,因此實際上不需要綁定任何東西:

 $(document).ready(function() { var $ = document.getElementById.bind(document); // <-- bind without calling class someClass { constructor() { this.ready = false; } setup() { this.ready = true; } } $('startButton').addEventListener('click', function(event) { var obj = new someClass(); obj.setup(); console.log(obj.ready); // true }); });
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button id="startButton">Start</button>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM