2

如果我创建一个这样的类:

function MyClass(input){
  // construct something;
  var myInstanceName = ???
}

创建实例时我需要实例的名称...

var MyInstance = new MyClass("Make Something");

需要知道 myInstanceName(在这种情况下为 =“MyInstance”),因为有一个创建按钮的方法,并且“onclick”必须调用此实例的方法。

我试过“this.name”,但它返回未定义......我如何获得这个值?

编辑:这是一个经过测试的工作示例:

function MyClass(WhereGoesTheButton){
    this.myName = "Test"; // <-- here is the issue
    this.idButton = WhereGoesTheButton;
    //
}
MyClass.prototype.createButton = function(){
    document.getElementById(this.idButton).innerHTML = '<button id="myId" onclick="'+this.myName+'.callBack(this);">Press Here</button>';
}
MyClass.prototype.callBack = function(who){
    alert("Button "+who.id+" has been pressed!");
}
var Test = new MyClass("testArea");
//
function ini(){
    Test.createButton();
}

只需将其放在带有正文 onload ini() 和一些 div 的页面中即可创建按钮。

它有效,但欢迎使用具有更好实践的替代方案!

编辑 2:这将完成这项工作,尽管我们仍然没有实例的名称:

var MyClassId = 0;
function MyClass(WhereGoesTheButton){
    this.myButtonId = "MyClass"+String(MyClassId);
    MyClassId++;
    this.idButton = WhereGoesTheButton;
    //
}
MyClass.prototype.createButton = function(){
    var me = this;
    document.getElementById(this.idButton).innerHTML = '<button id="'+this.myButtonId+'" >Press Here</button>';
    document.getElementById(this.myButtonId).addEventListener("click", function(e){ me.callBack(this); }, false);
}
MyClass.prototype.callBack = function(who){
    alert("Button "+who.id+" has been pressed!");
}
var Test = new MyClass("testArea");
//
function ini(){
    Test.createButton();
}
4

4 回答 4

3

简单的代码示例:

 function Parent(){
        // custom properties
    }

    Parent.prototype.getInstanceName = function(){
        for (var instance in window){
            if (window[instance] === this){
                return instance;
            }
        }
    };

    var child = new Parent();

    console.log(child.getInstanceName()); // outputs: "child"
于 2015-04-06T04:31:28.443 回答
1

需要知道 myInstanceName(在这种情况下为 =“MyInstance”),因为有一个创建按钮的方法,并且“onclick”必须调用此实例的方法。

为什么你需要变量名呢?您的方法可以使用this.

但是,点击处理程序内部this将是被点击的元素。假设你绑定事件有点像这样:

someElement.addEventListener('click', this.someMethod, false);

...您可以将其更改为:

var that = this;
someElement.addEventListener('click', function(e) {
    that.someMethod()
}, false);

还有其他可能的解决方案,例如bindEventListenerinterface

于 2013-09-30T21:06:57.470 回答
0

this在构造函数内部时引用实例。但是,请注意,在 Javascript 中,是在调用函数时this动态确定的。所以如果你是例如。在没有明智使用的情况下在构造函数中设置处理程序,您可能会遇到错误。thisbind

有关更多信息,请参见此处this

于 2013-09-30T22:03:11.387 回答
0

如果你真的需要这个名字,我最好的建议是,只需将它作为构造函数中的可选参数传递。然后,如果提供可以设置成员属性this.instanceName = passedNameArgument,然后稍后访问它以进行错误处理或您需要的任何内容。

于 2018-12-29T01:16:25.517 回答