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));
}