我想知道如何在javascript(nodejs)中为从外部(数据库,网络等)接收的对象提供行为的最佳实践。
例如,假设我有一些getById(<Id>)
函数从db中获取正确的对象,你将如何在该函数返回的对象上添加save
方法?
以下是我想要的内容:
var getById = function (id) {
var obj = callSomeExternalCode(id);
return obj;
};
var myObj = getById('1234');
myObj.aProperty = 'a_new_value';
myObj.save();
我宁愿避免使用伪经典解决方案(无论如何,如果你能为我提供一个好的解决方案,我可以根据自己的风格进行调整)
编辑:我忘了提到,将这些方法定义在一个单独的“父”对象中是非常好的(即使我认为原始继承不是答案)
由于
答案 0 :(得分:1)
为什么不将myObj传递给前面的另一个工厂/装饰对象?
即
myAugmentedObj = User.augment(myObj);
myAugmentedObj.save();
编辑:
更具体地说:
var UserModule = {
save: function ( ... ) { ... },
anotherFunction: function ( ... ) { ... }
};
var User = {
augment: function (user) {
return $.extend(user, UserModule);
}
};
顺便说一下,
我实际上会将User设为一个类,并将UserModule作为其中的一部分而不是单独的对象,然后将新对象创建为User的实例。但你明确提到避免经典继承。
答案 1 :(得分:1)
将这些方法定义在单独的“父”对象
中会非常好
然后就这样做:
var parent = {
save: function() {…}
};
function getById(id) {
// There's a shortcut function called "extend" for this in many libs:
// return extend(callSomeExternalCode(id), parent);
// which does
var obj = callSomeExternalCode(id);
for (var p in parent)
obj[p] = parent[p]; // copy
return obj;
}
我想,原始继承不是答案
可能是,尤其是parent
上的属性多于新obj
上的属性。然后你可以做(即使没有任何伪经典代码):
function getById(id) {
// return extend(Object.create(parent), callSomeExternalCode(id));
// long:
var obj = callSomeExternalCode(id),
res = Object.create(parent);
for (var p in obj)
res[p] = obj[p]; // copy
return res;
}
答案 2 :(得分:0)
这样的东西?
var getById = function (id) {
var obj = callSomeExternalCode(id);
obj.save = function() {
// do something
}
return obj;
};