jd.
jd.

Reputation: 4098

Initializing singleton javascript objects using the new operator?

In javascript, what is the difference between:

var singleton = function(){ ... }

and

var singleton = new function(){ ... }

?

Declaring priviliged functions as described by crockford (http://www.crockford.com/javascript/private.html) only works using the latter.

Upvotes: 1

Views: 952

Answers (2)

Christian C. Salvadó
Christian C. Salvadó

Reputation: 827792

The difference is mainly that in your second example, you are using the Function Expression as a Constructor, the new operator will cause the function to be automatically executed, and the this value inside that function will refer to a newly created object.

If you don't return anything (or you don't return a non-primitive value) from that function, the this value will be returned and assigned to your singleton variable.

Privileged methods can also be used in your second example, a common pattern is use an immediately invoked function expression, creating a closure where the private members are accessible, then you can return an object that contains your public API, e.g.:

var singleton = (function () {
  var privateVar = 1;

  function privateMethod () {/*...*/}

  return { // public API
    publicMethod: function () {
      // private members are available here
    }
  };
})();

Upvotes: 5

mattwindwer
mattwindwer

Reputation: 929

I think that a privileged function as described by crockford would look like this:

function Test() {
     this.privileged = function() {
          alert('apple');
     }
     function anonymous() {
         alert('hello');
     }
     anonymous();
}

t = new Test; // hello
t.privileged(); // apple

// unlike the anonymous function, the privileged function can be accessed and
// modified after its declaration

t.privileged = function() {
     alert('orange');
}

t.privileged(); // orange

Upvotes: 0

Related Questions