2012-07-04 3 views
5

Czy ktoś może wyjaśnić, co ten fragment z Single Page Apps in Depth oznacza?Ukrywanie metod klas za pomocą .call/.apply

Częstym wzorzec dla klas (na przykład obiekty instancja od prototypu ) jest po prostu zaznaczyć metod klasy jako private zaczynając im z podkreśleniem. Możesz poprawnie ukryć metody klas, używając .call/.apply, aby ustawić "to", ale nie będę tego tutaj pokazywał; to jest drobny szczegół o numerze .

myślę, że sugeruje, że istnieje sposób, aby rzeczywiście zrobić „prywatny” metody JavaScript rzeczywiście niedostępnych zamiast konwencji tylko znakowania ich znakiem podkreślenia, ale nie mogę sobie wyobrazić, co implementacja będzie wyglądać, ani jak to by było użyte.

+0

+1 za link do ebooka na jedną stronę! dzięki.. – renatoargh

Odpowiedz

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 jest wspólną prywatną funkcją konstruktorów i metod prototypowych. Korzystanie z niego może działać jak metoda i wykorzystywać this.

Bardziej kompletną realizacją tej koncepcji są obiekty interfejsu i obiekty implementacji. Zamiast kilku losowych funkcji-jak-metod (podobnych do zlokalizowanych powyżej) faktycznie tworzysz całą klasę, która jest prywatna. Każde zewnętrzne stworzenie interfejsu powoduje powstanie dwóch obiektów: interfejsu powłoki publicznej i prywatnego obiektu implementacji. Pozwala to na ujawnienie interfejsu, który udostępnia publicznie inny, prawdopodobnie łatwiejszy w użyciu interfejs API. Lub pozwala na ponowne wykorzystanie pojedynczych prywatnych obiektów implementacji dla całych grup obiektów interfejsu.

Tak właściwie działa DOM (zwykle nie jest zaimplementowany w js). Obiekty interfejsu (na przykład obiekty elementów i węzłów) są specjalnie wymagane do zawijania podstawowej implementacji, która faktycznie wykonuje słowo. Wyeksponowane obiekty to niewiele więcej niż powłoki, które przekazują dostęp do właściwości i wywołanie metody.

Dom.js jest implementacją DOM w pełni zrealizowaną w js. Ciekawą techniką, z którą się zapoznałem podczas pracy było całkowicie automatyczne generowanie publicznych interfejsów. To jest cel IDL: publiczny interfejs API jest generowany automatycznie, pozostawiając tylko własną implementację. Oznacza to, że możliwe jest tworzenie takich rzeczy bez konsultacji z człowiekiem: https://github.com/Benvie/svgstuff/blob/master/lib/defs.js

1

Możesz zobaczyć dwa typy zmiennych w tym przykładzie. można zauważyć, że pierwszy z nich jest prywatny, drugi jest dostępny publicznie:

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 

Running wewnętrzną testu pokazuje, że zm1 mogą być dostępne od wewnątrz klasy:

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