在javascript中控制相关对象的正确方法是什么?

时间:2010-02-17 13:21:41

标签: javascript oop

我是面向对象编程的新手,我正在慢慢学习如何将它应用于javascript。所以请耐心等待。 :)

我有两个基本对象:

  1. “record”,其中包含用于编辑记录集中单个记录的方法。 (创建,保存,加载等)

  2. “recordList”,其中包含输出分页记录标题列表的方法。

  3. 我希望这些对象能够一起工作。例如,如果调用record.save(),则还会调用recordList.refresh(),以便分页列表反映更新的数据。

    为了实现这一点,我创建了第三个对象“control”,它包含“record”和“recordList”的实例。我以下列方式使用“控制”:

    control = {}
    
        control.record = object.create("record");
        control.recordList = object.create("recordList");
    
        control.save = function() {
    
            this.record.save();
            this.recordList.refresh();
    
        };
    

    这很有效。但我想知道,这是正确的吗? (我想确保在执行此操作时我没有违反OO设计的任何规则。)有更好的方法吗?

    提前感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

你的解决方案很好。两个小改进建议

  1. 使用比控件更具体的名称(即使'recordControl'没问题)。您最终可能会对不同的功能集进行大量控制。

  2. 使用对象文字来创建整个对象。保持您的代码更整洁,更易读(并节省几个字节)

  3. (因缺乏间距而道歉 - 编辑没有做我想做的事!)

        recordControl = {
            record : object.create("record"),
            recordList : object.create("recordList"),
            save : function() {
                this.record.save();
                this.recordList.refresh();
            }
        }
    

答案 1 :(得分:1)

从OOP的角度来看,我认为记录不会自救。数据库中的记录只是数据,而数据库本身就是对数据进行处理的事情,无论是保存还是加载等等。据说我记录的只是一个保存数据的对象,并会创建一个记录集对象用于与数据交互。在该记录集对象中,您可以放置​​recordList并相应地更新它。类似的东西:

var recordset = function() {
    var me = this;
    var currentRecord = object.create("record");
    var recordList = object.create("recordList");
    me.save = function() {
            //Insert record.save code here
            recordList.refresh();
    };
};

有关该代码的注意事项。在那个设置中,currentRecord和recordList不能从函数外部访问,因此你有封装,这是OOP的标志之一。这是因为记录集函数是一个闭包,它“关闭”其中的所有变量,这意味着其中的每个函数都可以访问记录集范围内的变量。

您可以让外部世界通过获取或设置功能进行访问:

    me.getRecordList = function() {
        return recordList.getArray(); //Not generally a good idea to simply return your internal object
    };

答案 2 :(得分:0)

如果这是我随着时间的推移学到的一件事,那就是遵循任何范式的信件都会比你采用这个概念更加沮丧和困难,并且使用常识来决定你的偏差。 / p>

也就是说,您的解决方案可以正常工作,为多个不同类型的对象创建容器类是很正常的。如果您想要一种不同的方式来处理它,请查看Client Event Pooling。关于你所做的事情,我唯一可以说的就是确保你使用object.create按照预期的方式。

使用此方法,您可以创建一个事件,该事件在触发时将执行与您的事件关联的一系列其他命令。我已经在各种应用程序中取得了巨大的成功,从预期的事件挂钩到在回发后简化内联javascript注入。

祝你好运。

答案 3 :(得分:0)

为什么不将recordList提供给记录?

var record = object.create("record");
record.recordList = object.create('recordList');
record.save = function(){
    /*
        do something 
    */
    this.recordList.refresh();
}