function Class() {
  // private variable and methods
  var  self = this;
  var  private_var = 1;

  function private_func() {
    return private_var +
      self.instance_public +
      self.prototype_public;
  }

  function private_friends() {
    return private_func() +
      self.instance_public_func() +
      self.prototype_public_func();
  }

  // instance public variable and methods
  this.instance_public = 2;

  this.instance_public_func = function() {
    return private_var +
      this.instance_public +
      this.prototype_public;
  }

  this.instance_public_friends = function() {
    return private_func() +
      this.instance_public_func() +
      this.prototype_public_func();
  }
}

// prototype public variable and methods
Class.prototype.prototype_public = 4;

Class.prototype.prototype_public_func = function() {
    // private_var (hidden from prototype)
    return this.instance_public +
      this.prototype_public;
}

Class.prototype.prototype_public_friends = function() {
    // private_func (hidden from prototype)
    return this.instance_public_func() +
      this.prototype_public_func();
}

