title: Javascript: Calling object methods within that object
body: <p>What is the best design pattern for achieving the following (which doesn't work)?</p>
  
  <pre><code>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();
  </code></pre>
  
  <p>A variation which I think should work is</p>
  
  <pre><code>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;
  
  })();
  </code></pre>
  
  <p>Similarly, how does it work for objects meant to be created with the <code>new</code> operator? Within the constructor function itself you can write <code>this.method()</code>. But what if you want to keep the constructor small, only defining those things which will likely be customized upon creation, and then defining the rest in the prototype? (This seems to be the common pattern.) Can the properties / methods within the prototype interact in any way?</p>
  
  <pre><code>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;
    }
  };
  </code></pre>
  
  <p>I'm sure there's better ways to achieve my result whenever I run into this problem. This code isn't situation specific and just illustrates the general problem. So you won't be able to give me an alternative for those specific situations I run into. But maybe you can help my overall thinking.</p>