2012-01-19 21 views
6

¿Es posible tener propiedades privadas en un modelo? Al igual que las variables declaradas localmente en una función (constructor), no se adjunta a this, pero se declara localmente y visible solo por lo que se define en la función (constructor). Ejemplo sin BB Vista:Propiedades privadas en modelos o vistas de Backbone.js

function MyView(aModel){ 

    var $internalInput = $('<input>'); 

    this.render: function($where){ 
    $internalInput.val(aModel.get('SomeProperty')); 
    $where.append($('<div class="inputWraper">').append($internalInput)); 
    }; 
    this.toggleReadonly: function() { 
    toggle $internalInputs readonly attribute 
    } 
    ... 
    + Code to bind input.val to some aModel property(ies) and setup events 
    ... 
} 

Tenga en cuenta que internalInput no es accesible al mundo exterior y también aModel no es accesible (a través de al menos MyView). Entonces, si quiero usar Backbone.View para implementar el MyView anterior, ¿cómo lo haría y mantendría $ internalInput 'private'?

+1

Tenga en cuenta que lo único que logra "privado" es hacer que su código sea más lento. – Raynos

+0

¿Puedes elaborarlo por favor? Solo lo quiero con fines de ocultación de información para que pueda cambiarlo en el futuro, sin temor a que alguien pueda depender de él al haberlo usado directamente. Pero si esto significa ralentizar el código, entonces es un problema. ¿Dónde puedo encontrar más información sobre su reclamo? – Paralife

+1

[Los cierres tienen una sobrecarga masiva] (http://stackoverflow.com/a/8729939/419970), [El estado privado es caro pero se puede hacer mejor] (http://raynos.org/blog/23/Prototypes-and -privado-estado). Mi recomendación personal es usar '_foo' para _internal_ propiedades que probablemente cambien. Además, si alguien depende de las propiedades _internal_, es _su_ problema cuando cambia su API, no su problema – Raynos

Respuesta

10

Debería poder obtener datos privados pasando un IIFE al extend al definir sus objetos Backbone, en lugar de simplemente un objeto simple. Por ejemplo:

var Thing = Backbone.Model.extend((function() { 
    var foo = "Private data!"; 

    return { 
    bar: function() { 
     console.log(foo); 
    } 
    }; 
})()); 
+10

Esto le daría algo más parecido a una propiedad estática privada. Si está buscando emular las propiedades de instancias privadas (como la técnica var-in-constructor de OP), será lanzado por el estado compartido que le dejará. – matthewwithanm

+0

Sin dudas, funcionará, pero ¿es la única/mejor forma de lograr variables privadas en la red troncal? Esta respuesta habla un enfoque diferente http://stackoverflow.com/a/16320901/2253756 – KShirish

2

será mejor que con

var Thing = Backbone.Model.extend(
    { 
     constructor : function() 
     { 
      var _value = "Private data!"; 

      this.getValue = function() 
      { 
       return _value; 
      }; 
      this.setValue = function (value) 
      { 
       _value = value; 
      }; 
     } 
    }); 
+0

por lo que el uso diferente 'initialize' y' constructor'? –

+0

Sí, consulte la respuesta aquí: https://stackoverflow.com/questions/10118988/whats-the-difference-between-initialize-and-constructor-on-a-backbone-model –

0

Javascript es divertido!

var Thing = (function() { 
    var number_of_things = 0; 

    return function (options) { 
     var value = "Private data!"; 

     return new (Backbone.Model.extend({ 
      constructor: function constructor() { 
       number_of_things += 1; 
      }, 

      getValue: function getValue() { 
       return value; 
      } 
     }))(); 
    }; 
}()); 

estoy un poco preocupado por el hecho de que cada instancia de esta "cosa" es también una subclase, en la jerga programación orientada a objetos.

0

En el contexto de la utilización de Broserify.js con Backbone (y en realidad cualquier proyecto por encima de media) que piensan que la manera de tener VARs privadas y funciones:

myView.js

'use strict'; 

var config  = require('../config.js'), 

    private_var = 'private variable', 
    my_private_fn = function() { 
     ... 
    }; 


module.exports = Backbone.Model.extend({ 
    initialize: function() { 
     this.my_public = 'public variable'); 

     console.log('This is my' + this.my_public); 
     console.log('This is my' + my_private); 
    }, 
}); 

La idea tomar a continuación, puede ir con Browserify: P

0

la forma más sencilla es la siguiente:

... 
initialize:function(properites){    
    // Init the logic with private and public methods/variable 
    this.logic.initFirst(this); 
    // Use public methods 
    this.logic.doSomething(); 
}, 

logic:{   
    initFirst:function(modelOrView){ 
     // Do not continue if already initiated 
     if(this.instance !== undefined) return; 

     // Write all logic here 
     this.instance = (function(logic, modelOrView){    
      // Private variables 
      var private = "private";     

      // Public methods 
      logic.doSomething = function(){ 
       console.log(private, modelOrView); 
      }; 

      // Private methods 
      function hidden(){ 

      } 

     }(this, modelOrView)); 
    } 

}, 
Cuestiones relacionadas