开发者

Initializing singleton javascript objects using the new operator?

开发者 https://www.devze.com 2022-12-20 03:05 出处:网络
In jav开发者_Go百科ascript, what is the difference between: var singleton = function(){ ... } and

In jav开发者_Go百科ascript, 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.


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
    }
  };
})();


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
0

精彩评论

暂无评论...
验证码 换一张
取 消