Pesquisa de site

Javascript com new ou não


Eu tenho a seguinte função

var myInstance =  (function() {
  var privateVar = 'Test';

  function privateMethod () {
    // ...
  }

  return { // public interface
    publicMethod1: function () {
      // all private members are accesible here
        alert(privateVar);
    },
    publicMethod2: function () {
    }
  };
})();

Qual é a diferença se eu adicionar um novo à função. Pelo Firebug, parece que os dois objetos são iguais. E, pelo que entendo, ambos deveriam aplicar o padrão singleton.

var myInstance =  new (function() {
  var privateVar = 'Test';

  function privateMethod () {
    // ...
  }

  return { // public interface
    publicMethod1: function () {
      // all private members are accesible here
        alert(privateVar);
    },
    publicMethod2: function () {
    }
  };
})();

Resposta #1

Embora o resultado final pareça idêntico, como ele chegou lá e o que foi executado é diferente.

A primeira versão executa a função anônima com this estando no contexto do objeto window. A segunda versão executa a função anônima, mas this está no contexto de um novo objeto vazio.

No final, ambos retornam outro objeto (seu Singleton). É apenas uma pequena diferença no contexto de execução.

Para testar isso, coloque um alert(this); logo antes da declaração da variável privateVar.

@Tom Squires: Isso não é necessariamente verdade e é uma prática ruim não declarar suas variáveis. Um script com a diretiva "use strict"; faz com que o motor de JS reclame (assumindo que o motor suporte "use strict";