2012-09-15 143 views
26

Si entiendo correctamente, de acuerdo con Douglas Crockford http://javascript.crockford.com/private.html, los métodos "privilegiados" son similares a los que conocemos como métodos "públicos". y los métodos "públicos" son algo diferente.Métodos públicos y privilegiados en javascript: ¿Por qué se llaman así?

Así es como yo lo entiendo:

  1. métodos "privilegiados" pueden acceder a las variables privadas ya que está definida en el interior del cierre cuando se define el resto de las variables privadas.

    var C = function(){ 
        var private; 
        this.privilegedMethod = function(){ 
         /* blah blah */ 
        }; 
    } 
    var cObj = new C(); 
    
  2. métodos "público" son los que se agregan al objeto fuera del objeto mismo, a través de prototipo.

    var C = function(){ 
        /* blah blah */ 
    } 
    C.prototype.publicMethod = function(){ 
        /* blah blah */ 
    }; 
    var cObj = new C(); 
    

Encuentro estas definiciones de "privilegiada" y "público" muy confuso. Creo que el método "privilegiado" no es más que un método público, tal como lo conocemos desde la programación orientada a objetos. Y creo que el método "público" es el que debería nombrarse como algo más. Si lo piensas, es un tipo de función extraña, 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 de ayuda independiente para el objeto.

Así que me preguntaba, ¿por qué Douglas Crockford creó estos términos confusos? ¿Y por qué la comunidad javascript adoptó estas terminologías? O si estoy equivocado sobre algo, por favor corrígeme.

+1

JavaScript no es un lenguaje OOP, sino que se basa en la herencia prototípica. Vale la pena mencionar las diferencias de forma diferente :) – singpolyma

+0

@singpolyma: http://stackoverflow.com/questions/3536048/is-oop-possible-in-javascript –

+0

Lo mejor que se puede hacer es ignorar todos los entornos de trabajo de 'visibilidad' y usa JavaScript tal como es. Si tiene propiedades privadas, guárdelas según corresponda. El uso de cierres para simular la visibilidad solo va muy lejos. No es una bala mágica y puede ser un gran dolor cuando las cosas se vuelven más complejas (herencia, por ejemplo). –

Respuesta

10

Dado que no existen modificadores de alcance como público/privado/protegido en JavaScript, con el fin de acercarse al mundo programación orientada a objetos, Douglas Crockford está utilizando este tipo de nombres, para no confundir a cualquiera que viene de, digamos Java

El método privilegiado puede ver variables, definidas dentro de la función (una nota importante aquí - en JavaScript, el único ámbito es el alcance de la función. No hay alcance del bloque) por lo que son "privilegiados". Sí, se pueden llamar desde una instancia de objeto, pero lo importante aquí es que vean todo, declarado con var (el material privado real)

Por otro lado, los métodos públicos, que están adjuntos a el prototipo del objeto tiene una cosa más importante: se evalúan una vez y se ven para todas las instancias del objeto dado.

Si utiliza la palabra clave this dentro de un método prototipo, apuntará a la instancia actual del Objeto pero podrá ver solo cosas, que están definidas dentro de this.

No sé si se aclarará, 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.

+2

Gracias por tomarse el tiempo para responder, pero esto realmente no responde mi pregunta. Usted simplemente está reiterando la definición de privilegio vs. público dada por Crockford. Mi pregunta era * por qué * fueron nombrados de esa manera. ¿Por qué no dejar simplemente la noción de "público" tal como es, en lugar de renombrarlo como "privilegiado", e inventar un nuevo término para lo que Crockford llama "público"? – Vlad

+4

Bueno, mi mejor opción es no confundir a las personas del mundo OOP con términos ya predefinidos como público y privado :) JavaScript es realmente confuso oO –

+0

Un método privilegiado tiene el privilegio de acceder a variables y funciones privadas. Los métodos públicos no tienen este privilegio. Si, en su método constructor, crea una var como "var x = 1", un método privilegiado puede hacer "x ++" y x ahora será igual a 2. Una función pública no puede acceder a x; no está definido en ese alcance. Si desea que una función pública acceda a x, debe adjuntarla a la instancia: "this.x = 1" – wpjmurray

3

Vlad, estoy de acuerdo contigo: ¡Estoy confundido también! vistazo 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()); 

priviliged vs public

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 

Por lo tanto, la respuesta: los métodos públicos < => métodos privilegiados no es verdad?

+0

échele un vistazo aquí: http://www.summa-tech.com/blog/2012/02/ 21/scoping-javascript-an-overview/ –

+0

No está respondiendo la pregunta del OP. Él sabe que los métodos públicos y privilegiados son diferentes. – LuxDie

0

La diferencia clave entre ambos tipos de métodos es que los métodos privilegiados PUEDEN HEREDAR, esto significa que las clases secundarias pueden acceder directamente, pero los métodos públicos no están disponibles para clases secundarias, por supuesto en un enfoque de herencia clásica.

Espero que esto sea útil.

+0

que el método protegido se puede heredar bien ... que los métodos públicos no están disponibles para las clases secundarias: *** No estoy de acuerdo ***. Son métodos privados que no son accesibles para las clases hijas y el mundo externo. –

1

En un lenguaje OOP tradicional, 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, la 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 se puede ver, tanto publicMethod y privilegedMethod son pública en el sentido de que ambos pueden ser accedidos externamente, pero privilegedMethod tiene acceso a los datos adicionales.

Cuestiones relacionadas