2012-01-19 9 views
6

क्या मॉडल में निजी गुण होना संभव है? एक (कन्स्ट्रक्टर) फ़ंक्शन में स्थानीय रूप से घोषित चर की तरह, this से जुड़ा नहीं है, लेकिन (कन्स्ट्रक्टर) फ़ंक्शन में जो भी परिभाषित किया गया है, केवल स्थानीय रूप से और दृश्यमान घोषित किया गया है। बी बी देखें बिना उदाहरण:मॉडल में निजी-जैसी गुण या 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 
    ... 
} 

ध्यान दें कि internalInput बाहर की दुनिया और aModel लिए सुलभ नहीं है भी सुलभ (MyView कम से कम के माध्यम से) नहीं है। तो अगर मैं उपरोक्त MyView को लागू करने के लिए बैकबोन का उपयोग करना चाहता हूं, तो मैं इसे कैसे करूँगा और $ आंतरिक इनपुट 'निजी' रखूंगा?

+1

नोट करें कि "निजी" प्राप्त करने वाली एकमात्र चीज आपके कोड को धीमा कर रही है। – Raynos

+0

क्या आप कृपया विस्तृत कर सकते हैं? मैं बस इसे छिपाने के उद्देश्यों के लिए चाहता हूं ताकि मैं भविष्य में इसे बदल सकूं, डर के बिना किसी को सीधे इसका इस्तेमाल करके उस पर निर्भर हो सकता है। लेकिन अगर इसका मतलब है कोड को धीमा करना तो यह एक मुद्दा है। मुझे आपके दावे पर और जानकारी कहां मिल सकती है? – Paralife

+1

[क्लोजर में भारी ओवरहेड है] (http://stackoverflow.com/a/8729939/419970), [निजी राज्य महंगा है लेकिन बेहतर किया जा सकता है] (http://raynos.org/blog/23/Prototypes-and -private राज्य)। मेरी व्यक्तिगत सिफारिश _intern_ गुणों के लिए '_foo' का उपयोग करती है जो बदलने की संभावना है। अगर कोई _internal_ गुणों पर निर्भर करता है तो यह _their_ समस्या है जब आपका एपीआई बदलता है, आपकी समस्या नहीं – Raynos

उत्तर

10

आप केवल एक सादे ऑब्जेक्ट की बजाय अपनी बैकबोन ऑब्जेक्ट्स को परिभाषित करते समय IIFE को extend पर पास करके निजी डेटा प्राप्त करने में सक्षम होना चाहिए। उदाहरण के लिए:

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

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

यह आपको एक निजी स्थैतिक संपत्ति के समान कुछ और देगा। यदि आप निजी आवृत्ति गुणों (जैसे ओपी की विविध-इन-कन्स्ट्रक्टर तकनीक) का अनुकरण करना चाहते हैं, तो आपको साझा स्थिति द्वारा फेंक दिया जाएगा जिससे यह आपको छोड़ देगा। – matthewwithanm

+0

निस्संदेह यह काम करेगा, लेकिन रीढ़ की हड्डी में निजी चर हासिल करने का एकमात्र/बेहतर तरीका है? यह उत्तर एक अलग दृष्टिकोण http://stackoverflow.com/a/16320901/2253756 – KShirish

2

बेहतर होगा कि तुम

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

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

बोलता है, इसलिए यह 'प्रारंभिक' और 'कन्स्ट्रक्टर' का अलग-अलग उपयोग करता है? –

+0

हां, कृपया यहां जवाब देखें: https://stackoverflow.com/questions/10118988/whats-the-difference-between-initialize-and-constructor-on-a-backbone-model –

0

जावास्क्रिप्ट मजेदार है के साथ बंद चाहते!

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; 
      } 
     }))(); 
    }; 
}()); 

मैं इस तथ्य है कि यह "बात" के प्रत्येक उदाहरण भी एक उपवर्ग है, OOP शब्दावली में से एक छोटे से चिंतित हूँ।

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); 
    }, 
}); 

विचार लेने के लिए:

0

बैकबोन के साथ Broserify.js का उपयोग कर के संदर्भ में (और वास्तव में मध्यम परियोजना के ऊपर किसी भी) मैं निम्नलिखित तरीके से निजी वार्स और कार्यों है पाया यहाँ Browserify के साथ जाना है: पी

0

सबसे आसान तरीका है निम्नलिखित:

... 
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)); 
    } 

},