106 votes

`new function ()` en minuscule "f" en JavaScript

Mon collègue a été à l'aide de "nouvelle fonction()" avec une minuscule "f" pour définir de nouveaux objets en JavaScript. Il semble bien fonctionner dans tous les principaux navigateurs et il semble aussi être assez efficace pour cacher les variables privées. Voici un exemple:

    var someObj = new function () {
        var inner = 'some value';
        this.foo = 'blah';

        this.get_inner = function () {
            return inner;
        };

        this.set_inner = function (s) {
            inner = s;
        };
    };

Dès que "cela" est utilisé, il devient une propriété publique de someObj. Donc someObj.toto, someObj.get_inner() et someObj.set_inner() sont tous à la disposition du public. En outre, set_inner() et get_inner() sont privilégiés méthodes, afin qu'ils aient accès à "l'intérieur" par le biais de fermetures.

Cependant, je n'ai pas vu de référence à cette technique. Même Douglas Crockford de JSLint se plaint à ce sujet:

  • bizarre de la construction. Supprimer les "nouveaux"

Nous sommes à l'aide de cette technique dans la production, et il semble bien fonctionner, mais je suis un peu anxieux à ce sujet car il n'est pas documentée n'importe où. Personne ne sait si c'est une technique valable?

64voto

CMS Points 315406

J'ai vu que la technique d'avant, elle est valide, vous êtes à l'aide d'une expression de fonction, comme si c'était une Fonction Constructeur.

Mais à mon humble avis, vous pouvez réaliser la même chose avec un auto-invocation de la fonction d'expression, je ne vois vraiment pas le point de l'utilisation de l' new de l'opérateur de cette façon:

var someObj = (function () {
    var instance = {},
        inner = 'some value';

    instance.foo = 'blah';

    instance.get_inner = function () {
        return inner;
    };

    instance.set_inner = function (s) {
        inner = s;
    };

    return instance;
})();

Le but de l' new de l'opérateur est de créer de nouvelles instances de l'objet, de la configuration de l' [[Prototype]] intérieur de la propriété, vous pouvez voir comment ce est fait par l' [Construct] propriété interne.

Le code ci-dessus va produire un résultat équivalent.

15voto

KennyTM Points 232647

Votre code est juste similaire à la construction moins étrange

 function Foo () {
    var inner = 'some value';
    this.foo = 'blah';

    ...
};
var someObj = new Foo;
 

12voto

DUzun Points 355

Afin de clarifier certains aspects et de faire de Douglas Crockford de JSLint pas à se plaindre au sujet de votre code voici quelques exemples d'instanciation:

1. o = new Object(); // normal call of a constructor

2. o = new Object;   // accepted call of a constructor

3. var someObj = new (function () {  
    var inner = 'some value';
    this.foo = 'blah';

    this.get_inner = function () {
        return inner;
    };

    this.set_inner = function (s) {
        inner = s;
    };
})(); // normal call of a constructor

4. var someObj = new (function () {  
    var inner = 'some value';
    this.foo = 'blah';

    this.get_inner = function () {
        return inner;
    };

    this.set_inner = function (s) {
        inner = s;
    };
}); // accepted call of a constructor

Dans l'exemple 3. expression dans (...) que la valeur est une fonction/constructeur. Il ressemble à ceci: nouveau (function (){...})(). Donc, si nous omettons de fin des parenthèses, comme dans l'exemple 2, l'expression est toujours valide appel du constructeur et ressemble à l'exemple 4.

Douglas Crockford de JSLint "pense" que tu voulais affecter la fonction à someObj, pas son exemple. Et après tout, c'est juste un avertissement, pas une erreur.

0voto

mintsauce Points 965

Comme Crockford dit, c'est bizarre. Voir du CMS de réponse. Mais, pour répondre explicitement, ce que vous faites est très bien, juste bizarre. Veuillez lire la ECMAScript spec. La dernière version est ici: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf Oui, c'est beaucoup de travail, mais cela en vaut la peine. Il peut être lourd, mais il n'est pas destiné à être lu du début à la fin. Il suffit de choisir les morceaux que vous avez besoin et suivez toutes les références croisées. Chaque fois que vous la regardez, il deviendra plus facile à comprendre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X