__proto__使ってprototypeを汚染せずに拡張する

(function() {
var R = window.R = function(selection) {
  return R.init(selection);
};

R = {
  init: function(selection) {
    this.__proto__ = selection ? selection.getRangeAt(0) : document.createRange();
    return this;
  },

  start: function(node, index) {
    this.setStart(node, index || 0);
    return this;
  },

  end: function(node, index) {
    this.setEnd(node, index || 0);
    return this;
  },

  sel: function(node) {
    this.selectNode(node);
    return this;
  },

  wrap: function(elem) {
    this.surroundContents(elem);
    return this;
  }
};
})();


__proto__へRangeオブジェクト登録したので、RからネイティブなRengeメソッド呼べる。
Rangeのprototypeへ追加せずに、Rangeオブジェクトに独自関数追加できた!

正確には

独自メソッドを持つオブジェクトRangeメソッド追加できた。

問題点

IE対応が遠退いたw


Selectionオブジェクトの有無でRangeオブジェクトを切り替えたいんだけれど、どうしたもんやら。