0

我想知道如何在javascript(nodejs)中为从外部(数据库,网络等)接收的对象提供行为的最佳实践。

例如,假设我有一些getById(<Id>)从数据库中获取正确对象的函数,你将如何save在这个函数返回的对象上添加一个方法?

这是我想要的:

var getById = function (id) {
   var obj = callSomeExternalCode(id);
   return obj;
};
var myObj = getById('1234');
myObj.aProperty = 'a_new_value';
myObj.save();

我宁愿避免使用伪经典的解决方案(无论如何,如果你能给我一个好的解决方案,我可能会根据我的风格调整它)

编辑:我忘了提,将这些方法定义在一个单独的“父”对象中会非常好(即使,我想,原型继承不是答案)

谢谢

4

3 回答 3

1

为什么不将 myObj 传递给前面的另一个工厂/装饰对象?

IE

myAugmentedObj = User.augment(myObj);
myAugmentedObj.save();

编辑:

更具体地说:

var UserModule = {
  save: function ( ... ) { ... },
  anotherFunction: function ( ... ) { ... }
};

var User = {
  augment: function (user) {
    return $.extend(user, UserModule);
  }
};

顺便一提,

我实际上会让 User 成为一个类,并将 UserModule 作为它的一部分而不是一个单独的对象,然后创建新对象作为 User 的实例。但是您明确提到避免经典继承。

于 2013-04-15T21:48:13.070 回答
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;
}

我想,原始继承不是答案

可能是这样,尤其是如果在 new 上的属性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;
}
于 2013-04-15T22:04:42.650 回答
0

像这样的东西?

var getById = function (id) {
    var obj = callSomeExternalCode(id);

    obj.save = function() {
        // do something
    }

    return obj;
};
于 2013-04-15T21:37:35.867 回答