在JavaScript中创建类onclick的新实例的正确方法是什么?

在JavaScript中创建类onclick的新实例的正确方法是什么?,javascript,class,instantiation,Javascript,Class,Instantiation,课堂示例: $(文档).ready(函数(){ var$=函数(id) { 返回文档.getElementById(id); } 上课 { 构造函数() { ... } someMethod() { ... } } …//此范围内的其余示例 }); 到目前为止,我能够在窗口加载时创建类对象的实例,然后在按钮单击事件上调用该类的方法,同时绑定this: var obj=new someClass() $('startButton').onclick=obj.someMethod.bind(ob

课堂示例:

$(文档).ready(函数(){
var$=函数(id)
{
返回文档.getElementById(id);
}
上课
{
构造函数()
{
...
}
someMethod()
{
...
}
}
…//此范围内的其余示例
});
到目前为止,我能够在窗口加载时创建类对象的实例,然后在按钮单击事件上调用该类的方法,同时绑定
this

var obj=new someClass()
$('startButton').onclick=obj.someMethod.bind(obj)
在我想要通过删除并创建该类对象的新实例来重置之前,所有这些都可以正常工作。我尝试了几种不同的方法:

首先,我尝试在单击按钮时调用一个函数,该函数比以前多执行一个任务(实例化一个新对象)。我尝试在全局范围内声明变量
obj
,为类型指定
var
,并将其分配给
null
,然后尝试在单击按钮时重新分配并绑定
this
。在我尝试调用我的
setup()
方法之前,这一直有效:

$('startButton')。onclick=function(){
var obj=新的someClass();
var obj.setup.bind(obj);//调用失败
}
然后我尝试了另一条路线,这或多或少让我在同一个地点着陆:

$('startButton')。addEventListener('click',函数(事件){
var obj=新的someClass();
log('obj是someClass的实例?',obj instanceof someClass);//返回true
obj.setup.bind(obj);//调用失败
});
如果不在
someClass
中创建一个新方法,手动将所有类属性重置回初始值(我宁愿重新调用构造函数),我如何在单击按钮时优雅地实例化一个新的类对象,并能够绑定

当我这样做时,是否可以在不首先将其标记为GC或以某种方式取消分配的情况下重新分配包含类对象的变量?除此之外,没有任何其他的参考资料。如果我的术语不适用,我会提前道歉。obj.setup.bind(obj)将上下文绑定到函数,但它不会调用它。您需要将其称为:

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

但是,在这种情况下,由于您直接在实例上调用该方法,因此实际上不需要绑定任何内容:

$(文档).ready(函数(){
var$=document.getElementById.bind(document);//
obj.setup.bind(obj)
将上下文绑定到函数,但它不调用它。您需要调用它:

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

但是,在这种情况下,由于您直接在实例上调用该方法,因此实际上不需要绑定任何内容:

$(文档).ready(函数(){

var$=document.getElementById.bind(document);//你能创建一个代码沙盒,这样我们就可以看到错误了吗?我在其中输入了一些示例。我无法用$(document).ready(function(){…})包装整个.js;但它似乎没有它就可以工作:你能为它创建一个CodeSandBox吗,这样我们就可以看到错误了?我在其中输入了一些示例。我无法用$(document).ready(function(){…})包装整个.js;但它似乎没有它就可以工作:一切都按预期工作。非常感谢您的清晰解释。我开始使用.bind主要是因为
这个
一直超出范围,不再在方法之间引用我的类。
obj.setup.bind(obj)();
有效。如果我有任何其他问题,我将参考您的其他方法。@VimOverNano
。当您需要将实例绑定到方法并稍后或在其他不同上下文中调用它时,绑定
非常有用。顶部的
var$=…
行就是这种情况。您可以声明该方法,并且可以在任何地方调用它否则。但是在
obj.setup();
的情况下,您可以直接调用它。不需要bindAll就可以正常工作。非常感谢您的明确解释。我开始使用.bind主要是因为
这个
一直超出范围,不再在方法之间引用我的类。
obj.setup.bind(obj)();
有效。如果我有任何其他问题,我将参考您的其他方法。@VimOverNano
。当您需要将实例绑定到方法并稍后或在其他不同上下文中调用它时,绑定
非常有用。顶部的
var$=…
行就是这种情况。您可以声明该方法,并且可以在任何地方调用它但是在
obj.setup();
的情况下,您可以直接调用它。无需绑定