我是面向对象编程的新手,我正在慢慢学习如何将它应用于javascript。所以请耐心等待。 :)
我有两个基本对象:
“record”,其中包含用于编辑记录集中单个记录的方法。 (创建,保存,加载等)
“recordList”,其中包含输出分页记录标题列表的方法。
我希望这些对象能够一起工作。例如,如果调用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设计的任何规则。)有更好的方法吗?
提前感谢您的帮助。
答案 0 :(得分:1)
你的解决方案很好。两个小改进建议
使用比控件更具体的名称(即使'recordControl'没问题)。您最终可能会对不同的功能集进行大量控制。
使用对象文字来创建整个对象。保持您的代码更整洁,更易读(并节省几个字节)
(因缺乏间距而道歉 - 编辑没有做我想做的事!)
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();
}