インスタンスに依存した初期値を持つ書き換え可能propertyの定義

インスタンスに依存してなければこれで済むから簡単ですよねー

function A(){}
var proto = A.prototype;
Object.defineProperty(proto,'key',{
  value : 'default',
  writable : true
});

インスタンスに依存している場合はprototype定義時にそのインスタンスが存在しないのでvalueで初期値を定義できません。
単純なコードだと、実際の値を保持する別propertyとget/setを定義して、まだ保持していなかったら設定するとかそうなるでしょう。

function foo(val) {
  // valの内容によって戻り値が変わると思いねえ
  return 'default';
}
function A(){}
var proto = A.prototype;
Object.defineProperty(proto,'key',{
  get : function () {
    var self = this;
    if (self._key === undefined) {
      self._key = foo(self);
    }
    return self._key;
  },
  set : function (val) {
    var self = this;
    self._key = val;
  }
});

しかし、無駄にpropertyを増やしたくありません。
こうします。
prototypeに対してconfigurable:trueにしてget/setありのpropertyを定義、
その中でインスタンスの(!=prototypeの)propertyを上書き定義します。

function foo(val) {
  // valの内容によって戻り値が変わると思いねえ
  return 'default';
}

function A(){}
var proto = A.prototype;
Object.defineProperty(proto,'key',{
  get : function () {
    var self = this;
    var val = foo(self);
    Object.defineProperty(self,'key',{
      value:val,
      writable:true
    });
    return val;
  },
  set : function (val) {
    var self = this;
    Object.defineProperty(self,'key',{
      value:val,
      writable:true
    });
  },
  configurable : true
});

ばっちり動きますね

a= new A;
b= new A;
a.key; // 'default'
a.key= 1;
a.key; // 1
b.key; // 'default'

参考http://d.hatena.ne.jp/Constellation/20101205/1291564928