2011-02-14 1 views
1

Dans l'exemple:Y a-t-il un nom pour cette construction particulière?

function foo() { 
    var bar = this.bar = function() { 
     return "bar"; 
    }; 
    this.mybar = function() { 
     return bar(); 
    } 
} 
var myFoo = new foo(); 
myFoo.bar = function() { 
    return "notbar"; 
}; 
myFoo.bar(); // returns 'notbar' 
myFoo.mybar(); // returns "bar" 

Fondamentalement, il permet une méthode privée interne à une fermeture, avec la possibilité d'être remplacé que pour l'accès externe. Donc, la référence à la fonction d'origine ne change jamais, pour les références de cette fonction dans la fermeture. Mais les instantiateurs de l'objet de fermeture peuvent remplacer cette fonction sans casser la fonctionnalité de l'objet.

Y a-t-il un nom pour cette construction particulière, et est-ce même utile?

+0

Plus ressemble à une altération de JavaScript. – ulidtko

Répondre

3

Si vous faites référence à l'affectation d'une fonction à une variable locale et à l'utilisation de cette fonction dans une autre méthode publique, alors oui, il s'agit d'une forme d'encapsulation de données . À part ça, je dirais qu'il n'y a pas de nom spécial pour ça.
var bar est une variable locale à la fonction et this.bar est une propriété du nouvel objet. La variable et la propriété ont le même nom, mais elles ne sont pas liées.

Cela n'est utile que si vous voulez rendre la fonction bar accessible au public et assurer le bon fonctionnement de l'autre fonction, dans le cas où le public bar est écrasé. Par conséquent, il s'agit d'une forme de protection des autres fonctions, mais ce n'est pas un modèle spécial pour permettre l'écrasement externe.

Si le seul but de this.bar doit être écrasé, alors vous atteindre la même chose avec:

function foo() { 
    var bar = function() { 
     return "bar"; 
    }; 
    this.mybar = function() { 
     return bar(); 
    } 
} 
var myFoo = new foo(); 
myFoo.bar = function() { 
    return "notbar"; 
}; 
myFoo.bar(); // returns 'notbar' 
myFoo.mybar(); // returns "bar" 

Bien sûr, si vous appelez myFoo.bar() avant d'attribuer une fonction à elle, alors vous obtiendrez une erreur.

Questions connexes