2011-01-27 15 views
5

तो, पहले सवाल यहां - कृपया नम्र रहें।मैं जावास्क्रिप्ट ऑब्जेक्ट नाम कैसे सेट कर सकता हूं जो console.log में वापस आ जाता है?

मैं विभिन्न गैर-वेब प्रोग्रामिंग पृष्ठभूमि से कुछ अन्य डेवलपर्स के साथ एक काफी जावास्क्रिप्ट भारी परियोजना पर काम कर रहा हूं और हमने अपने जावास्क्रिप्ट psuedo-classesभागों में सार्वजनिक और निजी विधियों और गुणों को पूरी तरह से कोशिश करने और उपयोग करने का निर्णय लिया है अच्छा कोडिंग अभ्यास (यानी हम जानते हैं कि इसमें कोई वास्तविक लाभ या सुरक्षा नहीं है)

हमने सार्वजनिक & निजी (यानी स्थानीय रूप से स्कॉप्ड वेरिएबल्स और सार्वजनिक खपत के लिए विशेषाधिकार प्राप्त तरीकों के साथ कार्यों का उपयोग करने के कुछ अलग तरीकों से खिलवाड़ किया है।) और वर्तमान में हम अपने जावास्क्रिप्ट क्लास कन्स्ट्रक्टरों को वास्तव में एक ऑब्जेक्ट वापस करने पर बस गए हैं जो केवल उनके सार्वजनिक इंटरफ़ेस का प्रतिनिधित्व करता है, जो प्रभावी रूप से अन्य सभी को छुपाता है।

यहाँ एक उदाहरण है:

function MyObject() 
{ 
    var _this = this; 

    this._privateProperty = 'somevalue'; 

    this._privateMethod = function() 
    { 
    // Do Something 
    } 

    this.public = 
    { 
    publicProperty : _this._privateProperty, 
    publicMethod : function(){ return _this.privateMethod() } 
    } 

    return this.public; 
} 

कौन सा instantiated जब और लॉग इन क्रोम में:

var obj = new MyObject(); 
console.log(obj); 

आउटपुट:

> Object 
    > publicMethod: function(){ return _this.privateMethod() } 
    > publicProperty: "somevalue" 
    >__proto__: Object 

अब मेरे सवाल का: क्योंकि सार्वजनिक लौट रहे थे जब आप console.log करेंगे तो कन्स्ट्रक्टर से नई ऑब्जेक्ट के रूप में इंटरफ़ेस ध्यान दें कि यह खुद को > Object के रूप में पहचानता है - जबकि यदि हम उस सार्वजनिक इंटरफ़ेस को वापस नहीं करते हैं तो इसे > MyObject के रूप में पहचाना जाता है।

आदर्श रूप में, हम बाद में डिबगिंग उद्देश्यों के लिए प्रदर्शित करना चाहते हैं और मुझे पता है कि _this.constructor.name के साथ नियंत्रक के "मायऑब्जेक्ट" नाम को कैसे पहुंचाया जाए, लेकिन इस बारे में कोई जानकारी नहीं है कि इसे कैसे सेट किया जाए।

क्या कोई इसे मैन्युअल रूप से सेट करने के बारे में जानता है?

नोट:
मैं जानता हूँ कि यह कुछ मायनों में जावास्क्रिप्ट सम्मेलन के एक bastardization और एक गोल छेद में एक वर्ग खूंटी फिट करने की कोशिश है, लेकिन हम यह एक बहुत ही स्पष्ट और पठनीय तरीका क्या हासिल करना हो पाया हम करने की कोशिश कर रहे थे। मैं इस बारे में सुझावों के लिए खुला हूं कि इसे एक अलग डिज़ाइन के साथ कैसे पूरा किया जाए, लेकिन आखिर में मैं एक ऐसे उत्तर की तलाश कर रहा हूं जो हमारे वर्तमान डिज़ाइन को फिट करे।

+0

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

+0

... वापसी मूल्य के संबंध में, मैंने सोचा कि इसे अनदेखा किया गया था जब निर्माता को 'नया' कहा जाता है। ऐसा लगता है कि यह किसी भी प्रकार का ऑब्जेक्ट लौटाएगा। – user113716

+0

ठीक है, हमने सोचा था कि एक ही नामित वस्तु में सभी सार्वजनिक इंटरफेस उपन्यास थे - इस तरह हम वास्तव में कक्षाओं के सार्वजनिक तरीकों और गुणों के लिए आंतरिक संदर्भ बना सकते हैं। मैं उम्मीद कर रहा था कि "ओह हाँ, बस ऑब्जेक्ट.नाम = _this.constructor.name" को सार्वजनिक रूप से वापस करें - लेकिन मैं डिज़ाइन परिवर्तनों का मनोरंजन करने के लिए तैयार हूं जो अभी भी स्पष्ट और पठनीय हैं :) – drewdah

उत्तर

2

मेरे टीम के सदस्यों के बहादुर प्रयासों के बावजूद और इस साइट के बहुत उपयोगी उपयोगकर्ताओं ने समाधान की पेशकश की है, हमने तय किया है कि यह डिज़ाइन अंततः अनजान है और इसके बजाय एक डिज़ाइन का चयन किया गया है जो थोड़ा कम स्पष्ट है, लेकिन प्राप्त करता है एक ही परिणाम।

function MyObject() 
{ 
    var _privateProperty = 'somevalue'; 

    function _privateMethod() 
    { 
     // Do Something 
    } 

    // Public Interface 
    this.publicProperty = _privateProperty; 
    this.publicMethod = _privateMethod; 

} 
इस दृष्टिकोण हम मूल रूप से डिफ़ॉल्ट रूप से हर संपत्ति और निजी विधि बना रहे हैं, और हमारे "वर्ग" के निचले भाग में हम लोगों को हम सार्वजनिक रूप से उपलब्ध चाहते बेनकाब साथ

। मुझे लगता है कि ज्यादातर सहमत होंगे कि यह हमारे प्रारंभिक डिजाइन से बेहतर सामान्य जावास्क्रिप्ट सम्मेलन का पालन करता है, जिसका आशा है कि दूसरों के लिए इसे पढ़ना और बनाए रखना आसान होगा।

उन लोगों के लिए धन्यवाद, जिन्होंने समाधान के साथ आने का प्रयास करने के लिए समय निकाला।

1

यह वह जगह है तरह-अजीब (लेकिन फिर, आप शायद अब :-) द्वारा कि करने के लिए इस्तेमाल कर रहे हैं, लेकिन आप एक स्थानीय एक के साथ वास्तविक "MyObject" निर्माता रद्द कर सकते थे: जाहिर है आप

function MyObject() { 
    function MyObject(p) { 
    for (var k in p) if (p.hasOwnProperty(k)) this[k] = p[k]; 
    } 

    this.public = new MyObject({ 
    publicMethod: function() { /* whatever */ }, 
    publicProperty: "something" 
    }); 
    return this.public; 
} 

उसमें से अधिकांश के लिए कोड को कारक बना सकता है, ताकि आप एक ऐसा कार्य कर सकें जो किसी विशेष वर्ग के लिए प्रारंभ करने के लिए एक फ़ंक्शन दिया गया हो, यह आपके लिए यह सब सेट कर देगा। (जैसे आप विवरण को संभालने के लिए कुछ पुस्तकालय समर्थन बिना प्रस्तावित नहीं किए हों एक प्रणाली को बनाए रखने के लिए रखना एक असली घर का काम, और लंबे समय तक एक बहुत ही मुश्किल बात काम कर रहा है, और भी कठिन बदलने के लिए रखने के लिए की तरह लगता है।)

+0

मेरे पास प्रतिनिधि नहीं है इसे उपयोगी के रूप में चिह्नित करें, लेकिन अगर मैंने किया तो मैं करूंगा। यह काफी जवाब नहीं है जिसे मैं ढूंढ रहा था, लेकिन यह एक दिलचस्प दृष्टिकोण प्रदान करता है। मैं इस अवधारणा को लेने और एक साधारण "सार्वजनिक इंटरफ़ेस" विधि या कक्षा (शायद मूल ऑब्जेक्ट निर्माण का विस्तार) करने का प्रयास करने जा रहा हूं जिसे मैं त्वरित/संदर्भ/कन्स्ट्रक्टर सेट कर सकता हूं। – drewdah

+0

@ ड्रूडाह जावास्क्रिप्ट एक * कार्यात्मक * भाषा है - "बेस क्लास" बनाने के बारे में सोचने के बजाय, ** फ़ंक्शंस ** बनाने के बारे में सोचें - यही वह भाषा है जो इस बारे में है। कार्य कार्य कर सकते हैं, और यह एक बेहद शक्तिशाली प्रतिमान है। .... इसके अलावा, आप जवाब दे सकते हैं इससे कोई फर्क नहीं पड़ता कि आपके पास कितने SO अंक हैं :-) – Pointy

+0

ठीक है, इस सार्वजनिक/निजी मुद्दे से अलग कुछ बुनियादी विरासत करने की भी कोशिश कर रहे थे। हमने अपने मूल ऑब्जेक्ट निर्माण (यहां वर्णित http://phrogz.net/js/classes/OOPinJS2.html) के रूप में एक अधिक परिचित/पठनीय तरीके से एक हैरिट्स फ्रॉम() विधि को जोड़ा है। तो जब मैं "बेस क्लास" कहता हूं, तो वास्तव में मेरा मतलब केवल एक आधार फ़ंक्शन है जो विस्तारित कर रहा था ताकि हम सामान्य कार्यक्षमता के लिए समान तरीकों को फिर से लिख नहीं सकें। ओह, और स्पष्ट रूप से आपसे असहमत हैं - बस आपके जवाब को फिर से वोट करने का प्रयास किया और यह कहता है कि मुझे ऐसा करने के लिए 15 प्रतिनिधि की आवश्यकता है :( – drewdah

2

आप obj के 'toString' फ़ंक्शन को सेट करने में सक्षम होना चाहिए। जैसे

obj.constructor.prototype.toString = function() { return "MyObject"; } 

यह ऑब्जेक्ट के बजाय console.log प्रदर्शित 'MyObject' बना देगा।

+0

हम वास्तव में हमारे कुछ सार्वजनिक इंटरफेस में टॉस्ट्रिंग सेट कर रहे हैं, लेकिन दुर्भाग्य से कंसोल.लॉग में ऑब्जेक्ट टू मायऑब्जेक्ट को नहीं बदला जाता है। हालांकि, यदि आप तत्काल ऑब्जेक्ट को "सतर्क" करते हैं तो यह लौटने वाले मान को टॉस्ट्रिंग में प्रदर्शित करता है। – drewdah

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

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