2012-09-06 11 views
6

मैं जावास्क्रिप्ट में कक्षाएं बनाने के लिए उपयोगिता पर काम कर रहा हूं। और यह काम करता है, समस्या यह है कि निजी विशेषताओं को कैसे परिभाषित किया जाए।निजी संपत्तियों के साथ क्लास बनाने

इस कोड

var OO = { 

    Class:function(){ 

     var len = arguments.length; 
     var data = arguments[len-1]; 



     var Klass; 
     if (data.constructor === Object){ 
      Klass = function(){}; 

     } else { 
      Klass = data.constructor; 
      delete data.constructor;     
     } 



     OO.extend(Klass.prototype,data); //Classic Extend Method 


     return Klass; 


    }, 
//Simple extend method, just what I need in this case 
    extend: function(target, source){ 
      var prop; 
      for (prop in source) 
       target[prop] = source [prop]; 

    } 
} 

है यह है कि यह कैसे

// first create a class 
var person = OO.Class ({ 
constructor: function (name, age) { 
this.name = name; 
this.age = age; 
}, 

name:'', 
age:'', 

getName: function() { 
return this.name; 
}, 

getAge: function() { 
return this.age; 
} 

}); 

काम करता है और यहाँ उदाहरण

var one = new Person ('josh', 22); 

और समस्या है:

one.age// returns 22 
one.name// returns josh 

क्या मैं जरूरत है कि इन गुणों केवल getName() और getAge()

EDIT1 तरह के तरीकों द्वारा पहुँचा जा सकता है: जोड़ा समारोह

+1

आप मुश्किल से अपने वर्तमान समाधान का उपयोग कर ऐसा कर सकते हैं। – zerkms

+6

कुछ लोग जावास्क्रिप्ट को क्रमशः कोडिंग करने पर जोर क्यों देते हैं? – AlienWebguy

+2

आपको डगलस क्रॉकफोर्ड [जावास्क्रिप्ट में निजी सदस्य] (http://javascript.crockford.com/private.html) लेख में रुचि हो सकती है। – RobG

उत्तर

0

अद्यतन 1:

यहाँ यह कार्यशील प्रोटोटाइप। यह

को छोड़कर काम करता है 1.) निजी सदस्यों को निर्माण मूल्यों में पास करना। बेला बाहर

Dummy values do work however. 

टेस्ट:

http://jsfiddle.net/UWRHP/11/

+0

विस्तार कार्यान्वयन पोस्ट किया गया है! मैं सभी विशेषताओं को निजी चाहता हूं, इसलिए उपयोगकर्ता इसे example.attrib के माध्यम से सीधे प्राप्त नहीं कर सकता है, उसे गेटर्स और सेटर्स को परिभाषित करना होगा। ऐसा करने के बारे में कोई विचार है? –

+0

मुझे खेद है, लेकिन यहां से ऑनलाइन पाने के लिए थोड़ा मुश्किल है (मैं कैरेबियन से हूं)। आपके प्रश्न के जवाब में, मैंने मूल पोस्ट संपादित कर लिया है क्योंकि कार्यान्वयन अस्तित्व में नहीं है (अब तक)। यह मूल वर्गों से विस्तार करने का प्रयास करने का एक भविष्य का विचार है। –

+0

जैसा कि मैंने पहले कहा था, यहां से ऑनलाइन प्राप्त करना मुश्किल है, इसलिए एक और बार मुझे माफी माँगनी है, कृपया अपना कार्यान्वयन लिखें और वोट आपके लिए है। अग्रिम में धन्यवाद। –

-1

किसी भी चर, जो ऑब्जेक्ट के इंटरफेस का हिस्सा है बढ़ाएँ (यानी this.x और this.y) सार्वजनिक होंगे। आप गेटर्स के माध्यम से जाने के लिए उन चरों तक बाहरी पहुंच तक पहुंचने में सक्षम नहीं होंगे।

तो, जब तक आप इस तरह कोड है:

getAge: function() { 
    return this.age; 
} 

... आप इसे रोकने के लिए नहीं कर सकते हैं:

var one = new Person ('josh', 22); 
console.log(one.age); 

डगलस Crockford के लेख Private Members in JavaScript चेक बाहर।

+0

मेरे कोड के आधार पर ... गुणों को निजीकृत करने के लिए मजबूर करने के बारे में कोई विचार गेटर्स के माध्यम से accesible? –

+0

आपके कोड के आधार पर? सं। –

+1

क्या यह तकनीकी रूप से सच नहीं है? नीचे वोट क्यों? –

-1

तुम पर बातें जटिल नहीं करने के लिए (और पूरी तरह से खाई क्या आप अब तक किया है) के रूप में @AlienWebguy पता चलता है, आप डॉन देख रहे हैं

john.io.set('name', 'Johnny'); // still exposed! 
: जो अंत में बस के रूप में ज्यादा के रूप में सामने आ रहा है .name और .age गुण थे - 'टी भी .io सदस्य की जरूरत है

अंत में, .io ऑब्जेक्ट .name और .age गुणों के रूप में उजागर हुआ है, इसलिए यह एक जटिल समाधान है जो encapsulation और न ही सूचना छिपाने पर कोई प्रगति नहीं करता है।(क्षमा करें, @AlienWebguy, यह वही तरीका है जो मुझे लगता है)

यदि आप शास्त्रीय उत्तराधिकारी प्रतिमान और पारंपरिक जावास्क्रिप्ट ओओपी को पूरी तरह से मिटाने का प्रयास कर रहे हैं, तो परंपरागत कार्यों के रूप में-रचनाकारों के प्रतिमान को हटा दें और इसका उपयोग करने के बारे में भूल जाएं अपने कंस्ट्रक्टर्स में this संदर्भ:

// first create a constructor 
var Person = function(arg0, arg1) { 

    var that = {}; 

    // private variables 

    var age = arg0; 
    var name = arg1; 

    // public methods 

    that.getName = function() { 
     return name; 
    }; 

    that.getAge = function() { 
     return age; 
    }; 

    that.setAge = function(a) { 
     age = a; 
    }; 

    return that; 

}; 

var john = new Person('johnathan', 33); 

console.log(john.name);  // undefined 
console.log(john.getName()); // 'johnathan' 
console.log(john.age);  // undefined 
console.log(john.getAge()); // 33 
john.setAge(28); 
console.log(john.getAge()); // 28 
john.setName("Richard");  // Error - setName is not a function 

यह डगलस Crockford के Parasitic Inheritance का एक उदाहरण है ... लेकिन "विरासत" भाग के बिना। बिंदु यह है कि आवृत्ति चर age और name निजी हैं, लेकिन जावास्क्रिप्ट के कार्यात्मक परिवर्तनीय स्कॉइंग के कारण गुंजाइश में रहते हैं, इसलिए ऑब्जेक्ट के तरीके अभी भी उन्हें कुशल बना सकते हैं।

आप करेंगे भी नोटिस name चर कोई सेटर है, तो इस तकनीक को वैध तरीके से आप name चर तक पहुँच को नियंत्रित करने की अनुमति देगा कि - कोई छिपा this.name है और न ही this.io जो चर हेरफेर किया जा करने की अनुमति देगा; यह पूरी तरह से निजी है। (AlienWebguy के कोड संपादित)

+0

स्थानीय वर्र्स 'आयु' और 'नाम' बनाना अनावश्यक और भ्रमित है। – Maverick

+0

@ स्टाइलज़ - रिडंडेंट? दोहराया जाता है क्या? –

+0

पारित होने वाले तर्क पहले से ही उस दायरे में स्थानीय हैं। आपने उन्हें 'arg0' और' arg1' नाम दिया और किसी भी कारण से उन्हें फिर से सौंप दिया। स्पष्टीकरण के लिए मेरा कोड देखें। – Maverick

1

बंद निर्माता पैरामीटर द्वारा बनाई गई है, तो यह तुम सब करने की जरूरत है:

var Person = function(name, age){ 

    this.getName = function() { 
     return name; 
    }; 

    this.getAge = function() { 
     return age; 
    }; 

}; 

var john = new Person('johnathan', 33); 

document.writeln(john.name);  // undefined 
document.writeln(john.age);   // undefined 
document.writeln(john.getName()); // johnathan 
document.writeln(john.getAge()); // 33 
+1

+1 मैंने अपना जवाब हटा दिया, यदि ओपी कोई सेटर्स नहीं चाहता है तो यह बेहतर होगा। – AlienWebguy

+0

यह क्यों कम हो गया? – Maverick

+1

अच्छा सवाल .. – AlienWebguy

संबंधित मुद्दे