Javascript 无法读取属性';推动';自定义原型中数组上未定义的

Javascript 无法读取属性';推动';自定义原型中数组上未定义的,javascript,arrays,prototype,undefined,Javascript,Arrays,Prototype,Undefined,我得到了一个这样的定义: function className(data) { this.dataRecords = []; $.each(data, function(key, item) { this.dataRecords.push(new dataRecord(item.record)); } } 但出于某种原因,js并不认为this.dataRecords实际上是一个数组。 我修改了代码以执行以下操作: function classNa

我得到了一个这样的定义:

function className(data)
{
    this.dataRecords = [];
    $.each(data, function(key, item)
    {
        this.dataRecords.push(new dataRecord(item.record));
    }
}
但出于某种原因,js并不认为this.dataRecords实际上是一个数组。 我修改了代码以执行以下操作:

function className(data)
{
    var array = [];
    $.each(data, function(key, item)
    {
        array.push(new dataRecord(item.record));
    }
    this.dataRecords = array;
}
这很好,但我宁愿将数据推送到实际对象,而不是现在必须执行另一个
This.dataRecords=array以完成工作。我想从我的类的角度(比如addRecord和removeRecord)给出用于操作this.dataRecords的类函数,使用这种技术会变得有点乏味


有什么方法可以让js将数组(this.dataRecords)识别为数组吗?

在两个不同的上下文中表示不同的内容。稍加修改(而且非常常用)就能使它工作

function className(data) {
    this.dataRecords = [];
    var that = this;
    $.each(data, function(key, item) {
        that.dataRecords.push(new dataRecord(item.record));
    }
}

因为在
每个
的回调中,
这个
引用数组中的项

FIX1:

在输入每个
之前存储此值:

function className(data) {
    this.dataRecords = [];
    var that = this; // that is this
    $.each(data, function(key, item) {
        that.dataRecords.push(new dataRecord(item.record));
//      ^^^^ use that instead of this
    });
}
FIX2:

使用,因为他们没有绑定到任何
this
(他们没有
this
,所以只有
this
是您的类):

FIX3:

使用以下命令将
每个
的回调绑定到您的类:


当对函数调用
bind
时,返回值将是另一个函数,该函数的
值始终设置为
bind
的参数。因此,在上面我们定义了一个函数,它接受两个参数
(key,item)
,然后将它绑定到
this
this
在本例中是类的实例,因为我们仍然在构造函数的范围内),并传递
bind
的返回值(这是一个与原始函数类似的新函数,只是它的
this
设置为类的实例)到
每个

谢谢您的快速和充分的响应,这就是我要寻找的解决方案!:)谢谢您的回答,这是一个让“this”始终引用类实例的好方法。不客气!我正在编辑我的答案以添加一些文档链接。可能有用。嘿,你这个小偷;-)(你偷走了我的认可状态)箭头函数是一个相对较新的东西,在许多旧浏览器中并不存在。因此,我建议目前不要使用它们,除非使用了运输机。我还建议不要使用bind的解决方案,因为bind本身是一个返回函数新副本的方法,所以在这种情况下,bind可能弊大于利。考虑使用绑定函数作为侦听器回调的情况。它必须存储在某个地方,以便您以后能够删除它。可能正在添加内存泄漏。仍然。我给你竖起大拇指,因为答案很全面。我不得不同意汉普斯的观点,很多浏览器可能不支持第二和第三个补丁。然而,我相信这是最有帮助的答案,不仅对我,而且对未来的案例,以及积极使用MDN的人都是如此。PS:出于兼容性的原因,我仍然会选择第一个补丁。
function className(data) {
    this.dataRecords = [];
    $.each(data, (key, item) => {
        this.dataRecords.push(new dataRecord(item.record));
    });
}
function className(data) {
    this.dataRecords = [];
    $.each(data, function(key, item) {
        this.dataRecords.push(new dataRecord(item.record));
    }.bind(this));
}