如何在javascript中使用自定义方法扩充对象?

时间:2013-04-15 21:30:27

标签: javascript factory

我想知道如何在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();

我宁愿避免使用伪经典解决方案(无论如何,如果你能为我提供一个好的解决方案,我可以根据自己的风格进行调整)

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

由于

3 个答案:

答案 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;
};