gpt4 book ai didi

javascript - 为什么我的数据类成员不能直接使用?

转载 作者:行者123 更新时间:2023-11-28 16:25:02 27 4
gpt4 key购买 nike

我已经使用 jQuery 几年了,但对普通 javascript 的了解非常有限。我在 JavaScript 中看到的范围、对象模型和许多设计模式都让我感到困惑。我正在尝试实现一个类,该类最终将在我需要编写的调度插件中使用,但我很难理解为什么存储在我的一个类成员中的数据似乎不可用。我不确定问题是否与范围有关,或者是否与我不理解的其他行为有关。

我有以下代码,在适当位置的注释中有两个问题。第一个问题是 getJSON 调用中的作用域解决方法是否是处理 getJSON 内作用域问题的正确方法。我的第二个问题是为什么我无法直接访问 Schedule.data。

function Schedule() {
this.year = null;
this.month = null;
this.day = null;

this.start_datetime = null;
this.start_timestamp = null;
this.end_datetime = null;
this.end_timestamp = null;

this.data = [];

return this;
}

Schedule.prototype.init = function() {
var url = '/tripsys/new_admin/employee_schedule/get_employee_schedule_data/' + this.start_timestamp + '/' + this.end_timestamp;
var self = this; // 1. trying to work around scope issues. Is this the correct way to handle the scope problems here?
$.getJSON(url, function(data) {
self.data = data;
});
}

var schedule = new Schedule();

$(document).ready(function() {
schedule.year = $('#year').text();
schedule.month = $('#month').text();
schedule.day = $('#day').text();
schedule.start_datetime = new Date(schedule.year, schedule.month - 1, schedule.day);
schedule.start_timestamp = Math.round(schedule.start_datetime.getTime() / 1000);
schedule.end_datetime = new Date(schedule.year, schedule.month - 1, schedule.day, 23, 59, 59);
schedule.end_timestamp = Math.round(schedule.end_datetime.getTime() / 1000);

schedule.init();
console.log(schedule); // if I log the whole schedule object the data that I expect to be in the "data" member is there
console.log(schedule.data); // 2. why is the data that I expect to be in the "data" member not there when I access schedule.data directly?
});

感谢您的见解。

最佳答案

第一点是正确的,因为您仍然可以保存 this 引用,因为当 jQuery 调用内部函数时,函数内的 this将引用 ajax 对象。

在第二条注释中,您将在 ajax 请求完成之前记录 schedule.data。当您记录 schedule 时,您可以看到 schedule.data,因为当您在 google chrome 中记录对象时,在 chrome 控制台中手动“展开”对象后会检索对象属性。当您手动“展开”它时,此时请求已经完成。

您可以像这样重现它:

var a = {};
console.log(a); //do not "expand" the object properties yet
console.log(a.property); //undefined
a.property = "value";
//"expand" the already logged object and it will have "value"

关于javascript - 为什么我的数据类成员不能直接使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8303149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com