funciona - Métodos públicos y privilegiados en javascript: ¿Por qué se llaman así?
javascript pdf (4)
Si comprendo correctamente, según Douglas Crockford http://javascript.crockford.com/private.html , los métodos "privilegiados" son similares a lo que conocemos como métodos "públicos". y los métodos "públicos" son algo un poco diferente.
Así es como lo entiendo:
Los métodos "Privilegiados" pueden acceder a las variables privadas ya que se definen dentro del cierre cuando se definieron el resto de las variables privadas.
var C = function(){ var private; this.privilegedMethod = function(){ /* blah blah */ }; } var cObj = new C();
Los métodos "públicos" son los que se agregan al objeto fuera del propio objeto, a través del prototipo.
var C = function(){ /* blah blah */ } C.prototype.publicMethod = function(){ /* blah blah */ }; var cObj = new C();
Encuentro estas definiciones de "privilegiado" y "público" muy confusas. Creo que el método "privilegiado" no es más que un método público tal como lo conocemos en la programación orientada a objetos. Y creo que el método "público" es el que debería nombrarse como otra cosa. Si lo piensas, es un tipo de función extraño, es un miembro del objeto pero no puede acceder a ninguna otra variable privada, lo que significa que no contribuye a la encapsulación. Es casi como un método auxiliar independiente para el objeto.
Así que me preguntaba, ¿por qué a Douglas Crockford se le ocurrieron estos términos confusos? ¿Y por qué la comunidad javascript ha adoptado estas terminologías? O si estoy equivocado acerca de algo, por favor corríjame.
Dado que no hay modificadores de alcance como público / privado / protegido en JavaScript, para acercarnos al mundo de la POO, Douglas Crockford está usando esos nombres, no para confundir a nadie que viene de, digamos Java
El método privilegiado puede ver las variables, definidas dentro de la función (una nota importante aquí: en JavaScript, el único ámbito es el ámbito de la función. No hay ámbito de bloque) por lo que están "privilegiados". Sí, se pueden llamar desde una instancia de objeto, pero lo importante aquí es que vean todas las cosas, declaradas con var
(las cosas realmente privadas)
Por otro lado, los métodos públicos, que se adjuntan al prototipo del objeto tienen una cosa más importante: se evalúan una vez y se ven para todas las instancias del objeto dado.
Si usa this
palabra clave dentro de un método de prototipo, apuntará a la instancia actual del Objeto pero solo podrá ver las cosas que están definidas dentro de this
.
No sé si queda claro, pero lo principal aquí es que JavaScript es un lenguaje basado en prototipos y la cadena de prototipos se introdujo en el lenguaje para hacer posible la herencia.
En un lenguaje tradicional OOP, todos los miembros de una clase tienen acceso a todos los demás miembros de una clase.
Este no es el caso en Javascript. Un método público puede tener acceso a datos privados que ninguno de los otros miembros de la clase (a saber, función constructora) conoce. Igualmente, otros miembros de la clase pueden tener datos que el método no puede ver.
Considere a continuación:
function TheirTrait() {
var privateData = "foo";
this.privilegedMethod = function() {
return privateData;
}
}
function MyClass() {
var privateData = undefined;
this.publicMethod = function() {
return privateData;
}
TheirTrait.apply(this, arguments);
}
var myObject = new MyClass();
myObject.privilegedMethod() // returns "foo"
myObject.publicMethod() // returns undefined
Como puede ver, tanto el publicMethod
público como el publicMethod
privilegedMethod
son públicos en el sentido de que se puede acceder a ambos de forma externa, pero el publicMethod
privilegedMethod
tiene acceso a datos adicionales.
La diferencia clave entre ambos tipos de métodos es que los Métodos Privilegiados PUEDEN SER HEREDADOS, esto significa que las clases secundarias pueden acceder a ellos directamente, pero los Métodos Públicos no están disponibles para las clases secundarias, por supuesto, en un enfoque de herencia clásica.
Espero que esto sea de utilidad.
Vlad, estoy de acuerdo contigo: ¡Estoy confundido también! Mire aquí (de http://javascript.crockford.com/private.html ):
function Container(param) {
// methode privee
function dec() {
console.log(''private method is looking for private member secret : '' + secret);
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
// membres privées
var secret = 3;
var that = this;
// méthode privilégiée
this.service = function () {
console.log(''priviligied method is looking for private member secret : '' + secret);
return dec() ? that.member : null;
};
// membres publiques
this.member = param;
}
var myContainer = new Container(''abc'');
Container.prototype.stamp = function (string) {
console.log(''public method is looking for private member secret : '' + this.secret);
return this.member + string;
}
console.log(myContainer.stamp(''def''));
//for (i=0;i<4;i++)
console.log(myContainer.service());
Esta muestra jsfiddle mostrará:
public method is looking for private member secret : undefined
abcdef
priviligied method is looking for private member secret : 3
private method is looking for private member secret : 3
abc
Entonces, la respuesta: métodos públicos <=> métodos privilegiados ¿no es así?