2012-07-04 16 views
5

¿Alguien puede explicar lo que significa este extracto de Single Page Apps in Depth?Ocultando métodos de clase usando .call/.apply

Un patrón común para las clases (por ejemplo, objetos instanciados de un prototipo ) es marcar simplemente métodos de clase como privado iniciando ellos con un subrayado. Puede ocultar correctamente los métodos de clase utilizando .call/.aplicar para establecer "this", pero no lo mostraré aquí; es un detalle menor .

creo que sugiere que hay una manera de hacer realmente métodos JavaScript 'privado' en realidad inaccesibles en lugar de la convención de simplemente marcándolos con un guión bajo, pero no puedo imaginar lo que una aplicación se vería así, ni cómo se usaría.

+0

+1 para el enlace al ebook de aplicaciones de una sola página! Gracias.. – renatoargh

Respuesta

3
var Treasure = function(){ 
    function locate(){ 
    return this.x * this.y + 31337; 
    } 

    function Treasure(x, y){ 
    this.x = x; 
    this.y = y; 
    } 

    Treasure.prototype.find = function find(){ 
    return locate.call(this); 
    }; 

    return Treasure; 
}(); 

locate es una función privada compartida para los métodos de constructor y prototipo. Usando call puede actuar como un método y utilizar this.

Una implementación más completa de este concepto es la de objetos de interfaz y objetos de implementación. En lugar de tener algunas funciones al azar como métodos (similar a localizar arriba) realmente creas una clase entera que es privada. Cada creación externa de la interfaz da como resultado dos objetos embalados: la interfaz de shell público y el objeto de implementación privado. Esto le permite exponer públicamente una interfaz que proporciona una API diferente, quizás más fácil de usar. O puede permitirle reutilizar objetos de implementación privados individuales para grupos enteros de objetos de interfaz.

Así es como se especifica el DOM para funcionar (generalmente no implementado en js). Los objetos de interfaz (elementos y objetos de nodo, por ejemplo) son específicamente necesarios para ajustar la implementación subyacente que realmente hace la palabra. Los objetos expuestos son poco más que conchas que reenvían el acceso a propiedades y la invocación de métodos.

Dom.js es una implementación completa de DOM hecha en js. Una técnica interesante que conocí mientras trabajaba en ella fue la generación completamente automatizada de interfaces públicas. Este es el propósito de IDL: la API pública se genera literalmente de forma automática, dejando solo la implementación privada para que realmente se cree. Lo que realmente significa que es posible crear cosas como esta sin consultar a un humano: https://github.com/Benvie/svgstuff/blob/master/lib/defs.js

1

Puede ver los dos tipos de variables en este ejemplo. Usted notará que la primera es privada, el segundo es de acceso público:

function x() { 
    var _var1 = "hello"; 
    this.var2 = "world"; 
    x.prototype.innerTest = function() { 
     console.log("inner var1: " + _var1); 
     console.log("inner var2: " + this.var2); 
    } 
} 

var y = new x; 
console.log("var1: " + y._var1); 
console.log("var2: " + y.var2); 

// var1: undefined 
// var2: world 

Ejecución de la prueba interna muestra que var1 se puede acceder desde dentro de la clase:

y.innerTest(); 
// var1: hello 
// var2: world