面向对象的JavaScript:你会怎么做?

时间:2011-09-12 11:21:54

标签: javascript oop

由于我已经更好地了解了JS,我已经从程序风格转变为半OO(不要问我的意思是什么:基本上是一团糟!)但现在我想开始使用它正常。 OO吸引了我的编码大脑。

但是,我正在努力建立一个学校周的图书馆,我不确定我最好怎么做。

如果我只是使用一周的数组,它们看起来像这样:

    WeeksArray[36].StartDate = "2011-09-05";
    WeeksArray[36].EndDateSchool = "2011-09-09";
    WeeksArray[36].EndDateProper = "2011-09-11";
    WeeksArray[36].JSDate = new Date ( 2011, 8, 05 );
    WeeksArray[36].Type = "1";
    WeeksArray[36].Label = "Week 36: 5th Sept 2011";
  • :根据学校日历
  • 的周数
  • StartDate / EndDate :与MySQL兼容的日期范围
  • JSDate :周日开始的JS日期对象
  • 类型:学校时间表,第1周或第2周
  • 标签:表示周开始的人类可读标签

我希望其他脚本可以访问此库,以便他们可以加载包含学校日历中所有周的数组或对象。例如,我想象一下,我的一个脚本会根据这些信息生成一个下拉菜单,显示“第36周:2011年9月5日”,点击后会向我的PHP脚本发送请求。然后SQL数据库相应地过滤屏幕上的信息。 注意:我不需要帮助实现后者,它只是上下文的一个例子。

我开始编码如下:

var LEAP = {}

LEAP.Schedule = {

    init: function() {
        this.setWeeks();
    }

    setWeeks: function() {
        var WeeksArray = [];

但我看得越多,感觉就越不正确!

我应该创建“Week”对象,然后是一个容器,它有一个返回所有Week对象的方法吗?我一直在阅读John Resig的“Pro JavaScript Techniques”中的OOP章节,但事实是我不完全理解它。这感觉就像是正确的方法,但是对象中的对象正在伤害我的头脑。

最后的结果应该是我在我的一个页面上包含这个脚本,然后可以使用像var WeeksArray = LEAP.Schedule.getWeeks();这样的东西,但即便如此我也不确定这是否真实?

我很困惑......! :D对此主题的任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:2)

跟进我的评论。

您可能不需要正式的周对象。简单地存储哪些周是哪种类型以及将数字转换为日期的公式可能就足够了。因此,您的日历或计划对象可能具有一个属性,指示第1周开始的绝对日期,以及按顺序排列的周数类型。然后当调用getWeeks()时,它可以从第1周开始并构建一个必要周的数组,这可能是正式对象,或者可能只是关联数组:

weeks = [];
for (var i = 0; i < this.week_types.length; i++){
    weeks[i] = {
    "StartDate": this.get_start_date(i),
    "JSDate": this.get_js_date(i),
    ..., //The rest of the properties
    "type": this.week_types[i],
    "Label": this.get_label(i)
}

希望能让你走上正轨,如果我能提供进一步的澄清,我很乐意提供帮助。

答案 1 :(得分:2)

setWeeks: function(){
  var WeeksArray = []; //This variable is private, which is probably not your desired result.
}

^这不起作用,请参阅评论。

我推荐这样的东西: 外部文件:

var LEAP = {};
LEAP.Schedule = function(){//init
  //all events which should only occur once should be called here
  //Create the initial objects, e.g.
  this.weeks = [];
  this.calculateWeeks();
}
LEAP.Schedule.protoype.calculateWeeks = function(){
  for (var i=0; i<52; i++){
    this.weeks.push(Math.random()); //For the sake of the example ;)
  }
}
LEAP.Schedule.prototype.getWeeks = function(){
  return this.weeks;
}

主档案:

var Scheduleobject = new LEAP.Schedule();
var weeks = Scheduleobject.getWeeks();

对我来说,这感觉就像一种非常自然的OOP方法。 您甚至可以更改LEAP.Schedule函数,使其根据情况立即返回Weeks数组。

修改

周课程的一个例子:

LEAP.Schedule.week = function(n_year, n_month, n_day, n_week){
  //add code to validate the input
  //...
  //finished validating, processing:
  this.year = n_year;
  this.month = n_month;
  this.day = n_day;
  this.week = n_week;
}
LEAP.Schedule.week.protoype.getStartDate = function(){
  return year + "-" + pad(month) + "-" + pad(day);
}
//LEAP.Schedule.week.prototype.*Date are defined in a similar way
//The "EndDateSchool" and "EndDateProper" variables always follow the same pattern. Reduce the number of unnecessary variables by calculating these variables in the prototype function.
LEAP.Schedule.week.prototype.getLabel = function(){
  return "week" + this.week + ": " + this.day + (day==1||day==21||day==31?"st":day==2||day==22?"nd":day==3||day==23?"rd":"th") + " " + ["jan", "feb", "mar", "etc"][this.month-1] + " " + this.year;
}
function pad(n){return n>9?n:"0"+n}//a simple function to add a zero for your specific cases.

可以通过这种方式调用周课程:

var week = new Schedule.Week(2011, 8, 5, 36); //or this.Week(2011, 8, 5, 36) from the contex of the class.
var startDate = week.getStartDate(); //example`