在 JavaScript 中创建 class onclick 的新实例的正确方法是什么?
What is the proper way of creating a new instance of a class onclick in JavaScript?
Class 示例:
$(document).ready(function(){
var $ = function(id)
{
return document.getElementById(id);
}
class someClass
{
constructor()
{
...
}
someMethod()
{
...
}
}
... // rest of examples within this scope
});
到目前为止,我能够在 window 加载时创建 class 对象的实例,然后在按钮单击事件 [=38] 上调用该 class 的方法=] 同时 绑定 this
:
var obj = new someClass()
$('startButton').onclick = obj.someMethod.bind(obj)
一切正常,直到我想通过删除和创建该 class 对象的新实例来重置。我尝试了几种不同的方法:
首先,我尝试在单击按钮时调用一个函数,该函数比以前多执行一项任务(实例化一个新对象)。我尝试过在全局范围内声明变量 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
中创建一个新方法来手动将我的所有 class 属性重置回初始值(我宁愿重新调用构造函数),我如何优雅地实例化单击按钮上的新 class 对象 和 能够绑定 this
?
当我这样做时,是否可以重新分配保存 class 对象的变量而不首先将其标记为 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>
Class 示例:
$(document).ready(function(){
var $ = function(id)
{
return document.getElementById(id);
}
class someClass
{
constructor()
{
...
}
someMethod()
{
...
}
}
... // rest of examples within this scope
});
到目前为止,我能够在 window 加载时创建 class 对象的实例,然后在按钮单击事件 [=38] 上调用该 class 的方法=] 同时 绑定 this
:
var obj = new someClass()
$('startButton').onclick = obj.someMethod.bind(obj)
一切正常,直到我想通过删除和创建该 class 对象的新实例来重置。我尝试了几种不同的方法:
首先,我尝试在单击按钮时调用一个函数,该函数比以前多执行一项任务(实例化一个新对象)。我尝试过在全局范围内声明变量 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
中创建一个新方法来手动将我的所有 class 属性重置回初始值(我宁愿重新调用构造函数),我如何优雅地实例化单击按钮上的新 class 对象 和 能够绑定 this
?
当我这样做时,是否可以重新分配保存 class 对象的变量而不首先将其标记为 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>