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

7
我刚开始学习面向对象编程,并正在逐渐学习如何将其应用到JavaScript中。请耐心等待。:)
我有两个基本对象:
1. "record" 包含编辑记录集中单个记录的方法。(创建、保存、加载等) 2. "recordList" 包含输出分页记录标题列表的方法。
我希望这些对象能够协同工作。例如,如果调用 record.save(),则也会调用 recordList.refresh(),以便分页列表反映更新后的数据。
为了实现这一点,我创建了第三个对象 "control",其中包含 "record" 和 "recordList" 的实例。我使用 "control" 如下:
control = {}

    control.record = object.create("record");
    control.recordList = object.create("recordList");

    control.save = function() {

        this.record.save();
        this.recordList.refresh();

    };

这个方法是可行的。但我想知道,它是否合适?(我想确保我没有违反任何OO设计规则。)有更好的方法吗?
非常感谢您的帮助。

为什么你想在JavaScript中提供面向对象编程? - Roman
@Roman:因为我正在尝试构建一个大量使用ajax的应用程序。因此,大部分逻辑已经从后端移动到前端并向上移动。这使得前端变得更加复杂。所以,最好学习一下我将要使用的语言中的面向对象编程。 :) - Travis
4个回答

1

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

  1. 使用比control更具体的名称(即使是'recordControl'也可以)。您可能会为不同的功能集拥有大量控件。

  2. 使用对象字面量创建整个对象。这样可以使您的代码更整洁、更易读(并节省一些字节)

(对于缺少间距的问题表示抱歉 - 编辑器没有按照我的意愿进行操作!)

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

1

从面向对象编程的角度来看,我认为一个记录不会自行保存。数据库中的记录只是数据,数据库本身是处理这些数据的东西,无论是保存、加载等等。话虽如此,我会让记录只是一个保存数据的对象,并创建一个记录集对象来与数据进行交互。在记录集对象中,您可以放置记录列表并相应地更新它。类似于:

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在函数外部无法访问,因此您拥有了封装性,这是面向对象编程的标志之一。这是因为recordset函数是一个闭包,它“关闭”了其中所有变量的作用域,这意味着每个函数都可以访问recordset作用域内的变量。
您可以通过get或set函数让外部世界获得访问权限:
    me.getRecordList = function() {
        return recordList.getArray(); //Not generally a good idea to simply return your internal object
    };

谢谢提供信息。将一些方法从记录中移出并放入控制对象的建议似乎简化了事情。干杯。关于您提到的封装示例 - 这就是他们所称的模块模式吗? - Travis

0
为什么不将您的记录列表提供给记录中?
var record = object.create("record");
record.recordList = object.create('recordList');
record.save = function(){
    /*
        do something 
    */
    this.recordList.refresh();
}

我明白你的意思。但是,尽管它可以工作,我认为这并不“合理”。也就是说,考虑到每个对象所代表的含义,一个单独的记录对象包含一个记录列表对象是没有意义的。实际上,我的应用程序已经按过程编写得很好了。因此,我正在重新编写它,以便学习面向对象编程。这就是为什么我很挑剔 - 即试图保持我的对象交互方式“有意义”。 :) - Travis
记录不包含记录集,它包含对记录集的指针,它使用它,因此不会出现浪费内存或其他问题,在这种情况下不会损坏您的应用程序。 - shiberz
如果你想在面向对象编程方面进行练习,那么你应该决定实现哪种OO模式 - ORM或ActiveRecord - 它们实际上是做同样的事情,但方式不同。 - shiberz

0

如果有一件事情我随着时间学到的,那就是严格遵循任何范式都会导致更多的挫败和困难,而将概念发挥到极致并使用常识来决定你的偏差则会更好。

话虽如此,你的解决方案也可以正常工作,为多个耦合类型的对象创建容器类是很正常的。如果你想要不同的处理方式,请查看客户端事件池。关于你所做的唯一建议是确保你正在正确使用object.create方法。

使用这种方法,您可以创建一个事件,当触发时,将执行与您的事件相关联的一系列其他命令。我已经在各种应用程序中非常成功地使用了它,从预期的事件钩子到简化后回传后内联JavaScript注入。

祝你好运。


谢谢 - 有关事件池的文章很有趣。我可以问一下您使用 object.create 的意图是什么吗?谢谢。 - Travis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接