Javascriptのオブジェクトに後からメソッド追加する方法

簡単だった。

var attachMethods = function(obj,methods) {
  var wrap = function(a,f) {
    return function() { return f.apply(a,arguments); }
  };
  for (var name in methods) {
    if (obj[name]) throw "conflict:"+name;
    obj[name] = wrap(obj,methods[name]);
  }
  return obj;
}

以下のように使う。既存メソッドと名前がぶつかったらエラーを投げる。実行コンテキストでメソッド構成が変わるようなオブジェクトはあまりないのでこの仕様でOKでしょう。

  var sysObj = some.system.getObj();
  attachMethods(sysObj, {
    myMethod1: function(a,b,c) {
      this.apiFunc(a,b); // this --> sysObj
    },
    myMethod2: function(x,y) {
      ...
    },
    ...
  });