Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中控制相关对象的正确方法是什么?_Javascript_Oop - Fatal编程技术网

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

在javascript中控制相关对象的正确方法是什么?,javascript,oop,Javascript,Oop,我是面向对象编程新手,正在慢慢学习如何将其应用于javascript。所以请容忍我。:) 我有两个基本目标: “记录”包含从记录集中编辑单个记录的方法。(创建、保存、加载等) “记录列表”,其中包含用于输出记录标题分页列表的方法 我希望这些对象能够一起工作。例如,如果调用record.save(),则还将调用recordList.refresh(),以便分页列表反映更新的数据 为了实现这一点,我创建了第三个对象“control”,其中包含“record”和“recordList”的实例。我以以下

我是面向对象编程新手,正在慢慢学习如何将其应用于javascript。所以请容忍我。:)

我有两个基本目标:

  • “记录”包含从记录集中编辑单个记录的方法。(创建、保存、加载等)

  • “记录列表”,其中包含用于输出记录标题分页列表的方法

  • 我希望这些对象能够一起工作。例如,如果调用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设计的任何规则。)有更好的方法吗


    提前感谢您的帮助。

    如果这是我久而久之学到的一件事,那就是严格遵循任何范例都会比尽可能地接受概念并用常识来指示偏差带来更多的挫折和困难

    这就是说,您的解决方案会很好地工作,为耦合的多个不同类型的对象创建一个容器类是正常的。如果你想用另一种方式来处理它,请查看。关于您所做的事情,我唯一能说的就是确保您正在使用object.create,按照预期的方式创建它

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


    祝你好运。

    你为什么不把你的记录列表提供给记录呢

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

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

  • 使用比控件更具体的名称(甚至“recordControl”也可以)。最终可能会为不同的功能集提供许多控件

  • 使用对象文字创建整个对象。使代码更整洁、可读性更强(并节省一些字节)

  • (对于缺少间距表示歉意-编辑器没有执行我希望它执行的操作!)


    从面向对象的角度讲,我认为记录不会保存自己。数据库中的记录就是简单的数据,而数据库本身就是处理这些数据的东西,无论是保存还是加载,等等。也就是说,我会让记录只是一个保存数据的对象,并创建一个用于与数据交互的记录集对象。在该记录集对象中,您可以放置记录列表并相应地更新它。比如:

    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的一个标志。这是因为记录集函数是一个闭包,它“关闭”了其中的所有变量,这意味着其中的每个函数都可以访问记录集范围内的变量

    您可以通过get或set函数让外部世界访问:

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

    为什么你想用javascript提供oop?@Roman:因为我正在构建一个大量使用ajax的应用程序。因此,大部分逻辑已经从后端移到前端,并向上移到前端。这使得前端变得复杂了很多。因此,不妨用我将要使用的语言学习OOP。:)谢谢-关于事件池的文章很有趣。我可以请您澄清一下使用object.create是什么意思吗?谢谢。谢谢你的信息。关于将一些方法移出记录并移入控制对象的建议似乎简化了事情。干杯关于您的封装示例,这就是他们所说的模块模式吗?我明白您的意思。但我不认为这是“有意义的”,即使它是有效的。也就是说,考虑到每个对象所代表的内容,单个记录对象包含记录列表对象是没有意义的。事实上,我已经让应用程序正常运行了。所以我将其改写为学习OO的练习。这就是为什么我要挑剔的原因——即试图保持我的对象交互方式“有意义”。)记录不包含记录集,它包含指向它使用的记录集的指针,因此不会浪费内存或其他东西,也不会破坏你的应用程序。如果你希望在OOP中练习,那么你应该决定你在那里实现的OO模式是ORM还是ActiveRecord,它们实际上是以不同的方式做的
        me.getRecordList = function() {
            return recordList.getArray(); //Not generally a good idea to simply return your internal object
        };