2011-12-12 11 views
19

¿Hay alguna forma de hacer que una función sea privada en la red troncal, de modo que solo esté expuesta al modelo en sí y también tenga acceso a this?Cómo agregar una función privada en un modelo backbone.js?

¿Cómo puedo hacer que updateTime sea privado?

var Timeline = Backbone.Model.extend({ 
     url: 'servertime/', 

     start: function(){ 
      this.fetch({ 
       success: function(timeline, response){ 
        timeline.updateTime(); 
        setInterval(function() { 
         timeline.updateTime(); 
        }, 60 * 1000); 
       } 
      }); 
     }, 

     updateTime: function(){ //How can I make this private? 
      this.time = ... 
     } 
    }); 

Respuesta

14

se puede lograr esto envolviéndolo todo en una función anónima auto-invocando, de esta manera usted está seguro de que UPDATETIME es privado:

(function() { 
    var updateTime = function(){ // this stays private to this anonymous function 
    this.time = ... 
    }, 
    Timeline = Backbone.Model.extend({ 
    url: 'servertime/', 

    start: function(){ 
     this.fetch({ 
     success: function(timeline, response){ 
      updateTime.call(timeline); 
      setInterval(function() { 
      updateTime.call(timeline); 
      }, 60 * 1000); 
     } 
     }); 
    } 
    }); 

})(); 
+1

este ejemplo es incorrecto ya que 'updateTime' ya no es un método de línea de tiempo y' this' tiene el contexto incorrecto. – masylum

+0

Tienes razón, tenía prisa, he editado mi ejemplo ahora. – alessioalex

+0

Crítico para tener en cuenta 'updateTime.call (línea de tiempo)' para garantizar que el contexto apropiado se pase a 'updateTime'. –

7

Usted puede hacer updateTime un función privada pero no es un método privado . También recomiendo preceder un guión bajo para dejar en claro que es una función privada.

(function() { 
    function _updateTime(timeline){ 
    timeline.time = ... 
    } 

    Timeline = Backbone.Model.extend({ 
    url: 'servertime/', 

    start: function(){ 
     this.fetch({ 
     success: function(timeline, response){ 
      _updateTime(timeline); 
      setInterval(function() { 
      _updateTime(timeline); 
      }, 60 * 1000); 
     } 
     }); 
    } 
    }); 

})(); 
+1

Thumbs up para la especificidad con respecto al * método * vs * método *. – pilau

+0

Agregar un guión bajo * de ninguna manera * deja en claro que es una función privada; sin embargo, agrupar todas esas funciones en un objeto llamado _private o PRIVATE (pero no 'private' ya que es una palabra reservada), de modo que la función podría invocarse como _private.updateTime() o PRIVATE.updateTime() –

+2

@GeorgeJempty: Estoy en desacuerdo. Prefijando un método con un guión bajo por convención, sugiere que es privado, incluso si es públicamente accesible. He leído esto en los libros de patrones de diseño de JS. –

Cuestiones relacionadas