2012-01-11 17 views
5

मैं कुछ कोड के पुन: उपयोग को अधिकतम करने की कोशिश कर रहा हूं। अपने कस्टम जावास्क्रिप्ट वस्तु पर (मैं सरलता के लिए एक उदाहरण के रूप में PhoneNumber इस्तेमाल करेंगे), मैं इस तरह एक प्रोटोटाइप समारोह की स्थापना कर रहा हूँ:जावास्क्रिप्ट कस्टम ऑब्जेक्ट जेनेरिक

var Map = { 
    write: function() { 
     alert('My object is ' +this); 
    } 
}; 

function PhoneNumber(number) { 
    this.number = number; 
} 

PhoneNumber.prototype = Map; 

//I can call the write function like so 
var phoneObject = new PhoneNumber('1234567894'); 
phoneObject.write(); //ALERT My Object is Object{number:'1234567894'} 

सब कुछ तथ्य यह है कि किसी कारण से यह बदल जाता है के अलावा ठीक काम करता है मेरा फोन नंबर ऑब्जेक्ट अपने फोन नम्बर कन्स्ट्रक्टर को रखने के बजाए एक सामान्य ऑब्जेक्ट में। यदि मैं वास्तव में इस तरह के प्रोटोटाइप वस्तुओं के अंदर लेखन समारोह डालता हूं, तो यह पूरी तरह से काम करता है।

function PhoneNumber(number) { 
    this.number = number; 
} 

PhoneNumber.prototype.write = function() { 
    alert('My object is ' +this); 
} 

var phoneObject = new PhoneNumber('1234567894'); 
phoneObject.write(); //ALERT My object is PhoneNumber{number:'1234567894'} 

लेकिन मैं वास्तव में नहीं बल्कि क्योंकि एक से अधिक ऑब्जेक्ट लिखने फ़ंक्शन का उपयोग करें और वे सब ठीक उसी तरह से प्रदर्शन करते हैं यह इस तरह से करने की जरूरत नहीं होगी। मैं अपने ऑब्जेक्ट्स को सामान्य रचनाकारों में परिवर्तित करने से कैसे बच सकता हूं? जाहिर है, मैं मैप ऑब्जेक्ट को प्रोटोटाइप पर गलत तरीके से सेट कर रहा हूं, लेकिन यह काफी महत्वपूर्ण है कि मुझे सीधे कोड से ऑब्जेक्ट प्रोटोटाइप फ़ंक्शन में कोड कॉपी करने की आवश्यकता नहीं है। कोई विचार?

+0

यह साबित होता है PhoneNumber नक्शे से विरासत होना चाहिए नीचे, और 'Object.create' जाने का सही तरीका है। QED :) – Kos

उत्तर

2

आप स्थापित करने के लिए PhoneNumber.prototype.constructor

जब आप PhoneNumber.prototype = Map आप निर्माता संपत्ति को नष्ट भूल

PhoneNumber.prototype = Map; 
PhoneNumber.prototype.constructor = PhoneNumber; 
बेशक

कि क्योंकि आपके बस Map.constructor = PhoneNumber जो टूट जाता है अगर आप Map के रूप में कई प्रोटोटाइप का उपयोग कर काम नहीं करेगा । तो आप बस क्यों पूरे `new` /` .constructor`/`.prototype` बात एक बड़ी गंदगी और सुरुचिपूर्ण प्रोटोटाइप विरासत तंत्र के लिए एक बहुत टपकाया वाक्य रचना चीनी है

PhoneNumber.prototype = Object.create(Map, { 
    constructor: { value: PhoneNumber } 
}); 
+0

क्या ऑब्जेक्ट.क्रेट() एक क्रॉस ब्राउज़र समाधान है? मुझे समझ में थोड़ा परेशानी हो रही है कि यह कैसे काम करता है? – ryandlf

+0

@ryandlf [Object.create] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create) क्रॉस ब्राउज़र -> हाँ, विरासत ब्राउज़र -> नहीं। – Raynos

+0

उमेश अपने दूसरे जवाब में ऐसा करने के तरीके के विपरीत आपके ऑब्जेक्ट.क्रेट विधि का उपयोग करने का बेहतर विकल्प क्यों है? मैं सिर्फ उत्सुक हूं और पूरे ऑब्जेक्ट को पूरी तरह से समझने की कोशिश कर रहा हूं। ऐसा लगता है कि ऑब्जेक्ट.क्रेट का उपयोग नए ऑब्जेक्ट्स बनाते समय "नया" कीवर्ड को प्रतिस्थापित करने के लिए किया जाता है, मौजूदा प्रोटोटाइप में फ़ंक्शंस नहीं जोड़ता है। आपकी विधि के साथ, मैं अभी भी phoneObj.write() को कॉल करने में सक्षम हूं? – ryandlf

0

मुझे फ़ायरफ़ॉक्स में दोनों संस्करणों के साथ My object is [object Object] मिलता है।

आप इस बड़े पद पर एक नज़र लेने के लिए चाहते हो सकता है:

How do I get the name of an object's type in JavaScript?

Specficially, निर्माता के बारे में हिस्सा और ऑब्जेक्ट प्रकार के लिए जाँच instanceof का उपयोग कर। याद रखें कि जावास्क्रिप्ट में कक्षा जैसी कोई चीज नहीं है, इसलिए एक बार जब आप ऑब्जेक्ट को चालू करते हैं तो वास्तव में 'टाइप' की कोई समझ नहीं होती है और instanceof जैसी चीजें हैं जो इस के आसपास होने के लिए हैंक की तरह हैं।

+0

मेरा ऑब्जेक्ट प्राप्त करना ऑब्जेक्ट वह है जो मैं नहीं चाहता हूं। यह फोन नंबर होना चाहिए (या जो भी कन्स्ट्रक्टर मैं उपयोग कर रहा हूं)। मुझे पता है कि कन्स्ट्रक्टर नाम कैसे प्राप्त करें, यही समस्या है कि मैं वास्तविक कन्स्ट्रक्टर नहीं प्राप्त कर सकता क्योंकि किसी कारण से यह इसे सामान्य वस्तु में बदल देता है। – ryandlf

-1

ऐसा लगता है कि ऑब्जेक्ट लौटाया गया है बिना किसी टॉस्ट्रिंग विधि के फ़ोन नंबर। इस प्रयास करें:

var Map = { 
    write: function() { 
     alert('My object is ' +this); 
    } 
}; 

function PhoneNumber(number) { 
    this.number = number; 
    this.toString = function(){return "PhoneNumber"} 
} 

PhoneNumber.prototype = Map; 

//I can call the write function like so 
var phoneObject = new PhoneNumber('1234567894'); 
phoneObject.write(); //ALERT My Object is Object{number:'1234567894'} 
+0

कृपया डाउनग्रेड के लिए जानकारी प्रदान करें। :) –

0
function PhoneNumber(number) { 
    this.number = number; 
} 
var Map={ 
    write:function(){   
     console.log('My object is ' +this.number); 
    } 
} 
PhoneNumber.prototype.write = Map.write; 

var phoneObject = new PhoneNumber(1234567894); 
phoneObject.write(); 

यह यहाँ काम करता है। लेकिन यहां, किसी भी तरह से आपको मानचित्र ऑब्जेक्ट को बताने की आवश्यकता है कि ऑब्जेक्ट में इसकी चर के रूप में संख्या है।

+0

यह काम नहीं करता है। – ryandlf

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