Javascript: Chamar métodos de objeto dentro desse objeto

Qual é o melhor padrão de design para alcançar o seguinte (o que não funciona)?

var obj = (function() {

  // code defining private variables and methods

  var _obj = {
    property: value,
    method1: function() {
      // do stuff
    },
    method2: function() {
      // use property
      var prop = _obj.property; // obviously doesn't work
      // call method1
      obj.method1(); // "obj" not finished being defined yet!
    }
  };

  // obviously now I could do...
  var prop = _obj.property;

  return _obj;

})();

// and I could now do...
obj.method1();

Uma variação que acho que deveria funcionar é

var obj = (function() {

  var property = value,
      method1 = function() {
        // do stuff
      },
      method2 = function() {
        // use property
        var prop = property;
        // call method1
        method1();
      },
      _obj = {
        property: property,
        method1: method1,
        method2: method2
      };

  return _obj;

})();

Da mesma forma, como funciona para objetos destinados a serem criados com onew operador? Dentro da própria função de construtor você pode escreverthis.method(). Mas e se você quiser manter o construtor pequeno, definindo apenas as coisas que provavelmente serão personalizadas na criação e, em seguida, definindo o restante no protótipo? (Este parece ser o padrão comum.) As propriedades / métodos dentro do protótipo podem interagir de alguma forma?

var MyObj = function(name) {
  this.name = name;
};

var obj = new MyObj('Bob');

MyObj.prototype = {
  called_often: function() {
    // lots more code than just the following
    return document.getElementById('someID').value;
  },

  global_default: 'value', // can be changed, so need to pull value when run

  does_stuff: function(value) {
    var str = global_default + value, // can't access global_default on its own
        input = MyObj.called_often(), // doesn't work; MyObj.prototype.called_often() DOES
        name = this.name; // 'this' used in the prototype doesn't work
                          // even within a created object
    return name + input + str;
  }
};

Tenho certeza de que há maneiras melhores de alcançar meu resultado sempre que me deparo com esse problema. Este código não é específico da situação e apenas ilustra o problema geral. Então você não será capaz de me dar uma alternativa para essas situações específicas que eu me deparei. Mas talvez você possa ajudar no meu pensamento geral.

questionAnswers(2)

yourAnswerToTheQuestion