Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象构造函数-获取实例变量';姓名_Javascript_Oop - Fatal编程技术网

Javascript 对象构造函数-获取实例变量';姓名

Javascript 对象构造函数-获取实例变量';姓名,javascript,oop,Javascript,Oop,我正在创建一个名为ListBox的JavaScript对象,它接受一个二维数组,并将其输出到一个具有固定列标题、可滚动内容的表中,并可通过单击列标题进行排序。为了让HTML包含调用对象自身方法的事件处理程序,对象需要知道自己的实例变量名,例如 var MyList = new ListBox(); 设置列和内容后,相应的方法将生成HTML ... <td class="ListBox_ColumnTitle" onclick="MyList.SortByColumn(1)">...

我正在创建一个名为
ListBox
的JavaScript对象,它接受一个二维数组,并将其输出到一个具有固定列标题、可滚动内容的表中,并可通过单击列标题进行排序。为了让HTML包含调用对象自身方法的事件处理程序,对象需要知道自己的实例变量名,例如

var MyList = new ListBox();
设置列和内容后,相应的方法将生成HTML

...
<td class="ListBox_ColumnTitle" onclick="MyList.SortByColumn(1)">...</td>
...
但是,这在构造函数中不起作用-它根本找不到实例。之后它工作得很好,但我希望能够在构造函数中这样做,以使使用ListBox的代码更简单-这可能吗


我也意识到将变量名作为构造函数的参数传递要简单得多,但如果可以的话,我希望避免这种情况。

您可以通过在脚本中绑定事件而不输出
onclick
属性来完全避免此问题

function ListBox() {
    var that = this;

    // do your existing stuff

    var element = ...; // whatever you're currently doing to create the html
    element.onclick = function () {
        that.SortByColumn(1);
    };
}

不要这样做。千万不要尝试。


相反,您应该使用对象和对它们的引用。您不应该生成HTML(字符串),而应该生成DOM元素(对象)。您可以轻松地将函数作为事件侦听器分配给它们,只有您在自己的作用域中才能访问这些侦听器。

真正的问题是设计不好。代码应该对调用代码一无所知。这是调用代码的工作。为什么需要'var That=this'?在设置onclick函数时使用“this”会不会起作用?@Iain No,在onclick函数中
将引用被单击的元素。这就是为什么我们需要
That
来引用
ListBox
对象。
function ListBox() {
    var that = this;

    // do your existing stuff

    var element = ...; // whatever you're currently doing to create the html
    element.onclick = function () {
        that.SortByColumn(1);
    };
}