2009-06-18 13 views
3

Aussi simple que cela, pouvons-nous émuler la visibilité "protégée" en Javascript en quelque sorte?Ok, nous pouvons avoir des identifiants privés en javascript, mais qu'en est-il des protégés?

+0

Je pense que le point principal est que, dans une langue comme JavaScript, vous pouvez mettre la barrière là-bas ... mais c'est comme des sacs de sable ... cela n'arrêtera peut-être pas l'eau votre tapis: P –

+0

Je crois que callee est déprécié, et c'est ce sur quoi les gens semblent se fier pour le faire. – Nosredna

Répondre

4

Faites ceci:

/* Note: Do not break/touch this object */ 
...code... 

Ou un peu de google trouvé sur la première page:

http://blog.blanquera.com/2009/03/javascript-protected-methods-and.html

+0

Ce que fait ce type est juste ducktyping pour voir s'il est 'this' a la même méthode que la fonction d'appel ... il ne peut pas garantir que c'est le même type qui appelle. –

+0

Ce que j'essaie de dire, c'est que je ne pense pas que de cette façon vous pouvez vraiment protéger vos choses 'protégées': P –

+0

@Pablo, je suis totalement d'accord ... mais si vous voulez que ce comportement soit une sémantique concrète alors JS n'est pas la langue que vous voulez: P –

1

Que cela pourrait-il dire? Vous n'avez pas classes.

Je suppose que vous pourriez analyser caller pour déterminer s'il répond à un ensemble de critères pour être autorisé à appeler une méthode. Ce sera honteusement inefficace et vos critères seront toujours spoofable.

+0

Pas tout à fait vrai. En Javascript, tout est un objet. Vous définissez des classes en utilisant une syntaxe active, au lieu d'une syntaxe passive. Composition contre déclaration. – Christopher

+1

@Christopher ... Vous avez tort, juste parce qu'il est prototypique ne signifie pas que les prototypes sont des classes! Sont-ils aussi des interfaces? –

+2

Eh bien, d'accord. Mais ce que je veux dire, c'est que vous n'avez pas un espace de noms de catégorisations d'entités auxquelles un objet peut appartenir ou ne pas appartenir, ce qui est la clé de la visibilité protégée normalement. Vous ne pouvez pas dire à un héritier de quelque chose qui veut ressembler à un héritier. – chaos

2

Sure vous pouvez. Voici un autre example.

+0

Snap! :) ...... –

+1

Wow. C'est psycho. – chaos

+0

En fait, c'est CHAOS;) –

1

Il y a un motif intéressant qui mérite d'être mentionné ici: une fonction de constructeur de JavaScript peut renvoyer n'importe quel objet (pas forcément ce). On pourrait créer une fonction constructeur, qui retourne un objet proxy, qui contient des méthodes proxy aux méthodes "réelles" de l'objet instance "réel". Cela peut sembler compliqué, mais ce n'est pas le cas; voici un extrait de code:

var MyClass = function() { 
    var instanceObj = this; 
    var proxyObj = { 
     myPublicMethod: function() { 
      return instanceObj.myPublicMethod.apply(instanceObj, arguments); 
     } 
    } 
    return proxyObj; 
}; 
MyClass.prototype = { 
    _myPrivateMethod: function() { 
     ... 
    }, 
    myPublicMethod: function() { 
     ... 
    } 
}; 

La bonne chose est que la création de proxy peut être automatisée, si nous définissons une convention pour nommer les méthodes protégées. J'ai créé une petite bibliothèque qui fait exactement ça: http://idya.github.com/oolib/