2012-12-24 9 views
15

में मैं जब मैं ऊपर emberjs.com http://emberjs.com/documentation/#toc_reopening-classes-and-instancesअंतर फिर से खोलना() और reopenClass() Ember.js

पर प्रलेखन पढ़ रहा था पृष्ठ पर भ्रमित कर ली, इसे इस तरह बताते हैं।

Person.reopen({ 
    // override `say` to add an ! at the end 
    say: function(thing) { 
    this._super(thing + "!"); 
    } 
}); 

आप देख सकते हैं, फिर से खोलना एक उदाहरण के लिए गुण और विधियों को जोड़ने के लिए प्रयोग किया जाता है। लेकिन जब आपको कक्षा विधि बनाने या वर्ग को गुण जोड़ने की आवश्यकता होती है तो आप reopenClass का उपयोग कर सकते हैं।

Person.reopenClass({ 
    createMan: function() { 
    return Person.create({isMan: true}) 
    } 
}); 

Person.createMan().get('isMan') // true 

हालांकि स्पष्टीकरण कहते हैं, "फिर से खोलना एक उदाहरण के लिए गुण और विधियों को जोड़ने के लिए प्रयोग किया जाता है।", मुझे लगता है कि ऊपर दिखाए गए दोनों उदाहरण कैसे वर्ग विधि बनाने या वर्ग ही गुण जोड़ने के लिए के बारे में बात कर रहे हैं उदाहरण के लिए नहीं।

क्या मैं यह कहता हूं कि यह क्या कहता है? मैं एक अनुभवी प्रोग्रामर नहीं हूं, इसलिए मुझे गलत समझा जा सकता है ...

कृपया समझाएं कि अगर मुझे गलत समझा जाता है तो फिर से खोलने और फिर से खोलने का उपयोग कब करें।

अग्रिम धन्यवाद!

+1

[यह] (http://stackoverflow.com/questions/10269372/ember-js-how-does-reopenclass-work) प्रश्न आपकी मदद कर सकता है। – coderatchet

उत्तर

1

मैंने फिर से खोलने के बाद प्रयोग किया() और फिर से खोलना क्लास(), मैंने उनके बीच अंतर निकाला।

मेरे प्रयोग से परिणाम यहां दिया गया है।

var Person = Ember.Object.extend({ 

    name:"", 
    alive:true, 
    sayHi:function(){ 
     alert("hi"); 
    } 

}); 

Person.reopenClass({ 
    age:30, 

    sayHo:function(){ 
    alert("ho"); 
} 

}); 

Person.reopen({ 
height:180, 
sayYo:function(){ 
    alert("yo"); 
} 
}) 

var person = Person.create({ 
    name:"Tom" 
}); 


//person.reopenClass();//error!! 

person.reopen({ 
    sayWhat:function(){ 
     alert("what!?"); 
    }, 

    weight:100 

}); 

console.log(Person.alive);//undefined 
console.log(Person.age);//30 
console.log(Person.height);//undefined 
console.log(Person.weight);//undefined 

console.log(person.alive);//true 
console.log(person.name);//Tom 
console.log(person.height);//180 
console.log(person.weight);//100 

person.sayHi();//it works 

//person.sayHo();//it doesn't work 
Person.sayHo();//it works 

person.sayYo();//it works 
//Person.sayYo();//it doesn't work 

//Person.sayWhat();//it doesn't work 
person.sayWhat(); 
+2

क्या आप अपने प्रश्न को उत्तर के रूप में चिह्नित कर सकते हैं ताकि इसे अनुत्तरित सूची से हटा दिया जा सके? –

17

प्रलेखन बहुत अच्छी तरह से इस की व्याख्या नहीं करता है, लेकिन यह एक बहुत ही कठिन विषय है। http://emberjs.com/guides/object-model/reopening-classes-and-instances/

समस्याओं में से एक वस्तु उन्मुख प्रोग्रामिंग के बारे में बात के साथ कि यह अक्सर इस तरह समझाया गया है:

BTW, यह अब में रहता है - वस्तुओं वस्तुओं रहे हैं। ऑब्जेक्ट्स एक वर्ग के उदाहरण हैं। - कक्षाएं वस्तुएं हैं। - उदाहरण ऑब्जेक्ट्स हैं, और एक कक्षा है।

यह स्पष्टीकरण किसी भी पर मदद नहीं करता है, और यह एक पुनरावर्ती समस्या प्रतीत होता है (यानी संदर्भ के लिए कोई अंत नहीं है ... एक वस्तु एक वर्ग का एक उदाहरण है जो एक वस्तु है ... (दोहराने))।

मैं निम्नलिखित तरीके से कारण पसंद करते हैं:

जब लोगों को कोड लिखने, वे अक्सर वर्गों और उदाहरणों का वर्णन। कक्षाएं एक प्रकार की चीज हैं। फल एक वर्ग का एक उदाहरण है। हम यहां किसी विशेष चीज़ के बारे में बात नहीं कर रहे हैं, हम चीजों की एक पूरी "कक्षा" (इसलिए नाम) के बारे में बात कर रहे हैं।

ध्यान दें कि यह वास्तविक वर्ग नहीं है। यह केवल वास्तविक है जब यह "लाइव" और "कंप्यूटर में स्मृति में" है। तब तक, यह एक वर्ग का विवरण है। आम तौर पर जब लोग कोड लिखते हैं, तो वे टेक्स्ट फ़ाइल में टेक्स्ट लिखते हैं, और यह कंप्यूटर के अंदर वास्तविक कोड का वर्णन है जो तब होता है जब कंप्यूटर मशीन कोड में व्याख्या करता है या संकलित करता है।

मुश्किल बात तब आती है जब आप महसूस करते हैं कि एक वर्ग वास्तव में भी एक विवरण है।यह संभावित वास्तविक वस्तुओं की पूरी श्रृंखला का वर्णन है।

कंप्यूटर में, जब आप "एक सेब" बनाते हैं, तो यह एक उदाहरण है। यह एक वस्तु भी है। इसकी कक्षा ऐप्पल है, जो एक कंप्यूटर में एक असली लाइव ऑब्जेक्ट भी है। जब हम ऐप्पल के बारे में बात करते हैं, तो यह एक विचार है। यह वास्तविकता में अस्तित्व में नहीं है, लेकिन कंप्यूटर के लिए कुछ उपयोग करने के लिए इसे अपनी वास्तविकता में अस्तित्व में रखना चाहिए, इसलिए "ऐप्पल" एक ठोस, असली वस्तु है, भले ही यह एक अमूर्त भी है।

मुझे लगता है कि अंतिम बिंदु लोगों को वस्तुओं के बारे में उलझन में डाल देता है। कक्षाएं अमूर्त हैं, लेकिन कंप्यूटर के बारे में बात करने और उनके बारे में तर्क करने के लिए, उन्हें वास्तविक बनाना होगा। तो, हम तय करते हैं ... "वर्ग का अर्थ अमूर्त है, उदाहरण का मतलब असली है ..."

समस्या यह है कि हमारे पास विरासत है ... जो परतों के अवशोषण के विचार में लाती है ... तो हमारे फल मॉडल, आपके सामने विशेष सेब है, जो एक फल भी है, और फल भी एक भोजन है। हकीकत में, भोजन वास्तव में चीजों या चीजों के सेट के रूप में अस्तित्व में नहीं होता है, जब तक कि हम "यह भोजन, यह सेब" या "दुनिया में सभी भोजन" या "आपकी मां का लसगने" कहें, तो यह एक अमूर्त विचार है ...

तो, हमारे ऑब्जेक्ट उन्मुख कंप्यूटर में, हम कहते हैं, "खाद्य पदार्थ को परिभाषित करें जो एक प्रकार का ऑब्जेक्ट है, अब फलों को परिभाषित करें जो एक तरह का भोजन है, अब ऐप्पल को परिभाषित करें जो एक प्रकार का फल है, अब इसे परिभाषित करें सेब, जो एक तरह का ऐप्पल है "।

अब इसका मतलब है: - वस्तु खाद्य पदार्थ है, और भोजन वस्तु का एक उदाहरण है, और भोजन भी एक वर्ग है! - भोजन फल की कक्षा है, और फल भोजन का एक उदाहरण है, और फल भी एक वर्ग है! - फल ऐप्पल की कक्षा है, और ऐप्पल फल का एक उदाहरण है, और ऐप्पल भी एक वर्ग है! - ऐप्पल आपके सेब की कक्षा है, और आपका सेब ऐप्पल का एक उदाहरण है (और इसलिए फल, भोजन और वस्तु का भी!)। हालांकि, यह एक वर्ग नहीं है, यह सिर्फ एक वस्तु है।

अपने सेब के बारे में तर्क करने के लिए, हम कहेंगे कि यह एक वस्तु है (लोअरकेस ओ नोट करें), यह एक ऐप्पल, और एक फल और एक खाद्य भी है, और ... यहाँ किकर है .. यह भी एक वस्तु है।

तो अब उम्मीद है कि हम एक ऐसी स्थिति में हैं जहां हम समझ सकते हैं कि आपका सेब एक वस्तु है, एक उदाहरण (ऐप्पल, फल, खाद्य & ऑब्जेक्ट), एक ऐप्पल, एक फल, एक खाद्य और वस्तु, लेकिन यह एक वर्ग नहीं है।

तो ... यदि आप कक्षा में उदाहरण विधि जोड़ते हैं, तो यह कक्षा पर उपलब्ध नहीं होगा, लेकिन यह उस कक्षा के सभी उदाहरणों पर उपलब्ध होगा। यदि आप कक्षा विधि जोड़ते हैं, तो वह उस वर्ग (और उप-वर्ग) पर उपलब्ध होगा। तो यदि आप ऐप्पल को एक इंस्टेंस विधि जोड़ते हैं, तो सेब के सभी उदाहरण उस विधि को चलाने में सक्षम होंगे। यदि आप केवल अपने सेब के लिए कोई विधि जोड़ते हैं, तो केवल आपके सेब में वह विधि होगी। मेरा सेब नहीं होगा। यदि आप ऐप्पल को क्लास विधि जोड़ते हैं, तो केवल ऐप्पल क्लास उस विधि को चलाने में सक्षम होगी (जो, आसानी से आप इसके सभी उदाहरणों तक भी पहुंच सकते हैं)। क्लास विधियां ऐसी चीजों के लिए होती हैं जो पार्टिकुलर उदाहरण नहीं बदलती हैं। इंस्टेंस विधियां उन चीज़ों के लिए होती हैं जो पार्टिकुलर उदाहरण (आमतौर पर) बदलती हैं। गुण/गुणों के लिए वही बात होती है। आप "ऐप्पल रंग" नामक ऐप्पल क्लास पर क्लास विधि नहीं बनाएंगे क्योंकि ऐसा लगता है कि यह से संबंधित सेब (यानी उदाहरण) से संबंधित है। उम्मीद है कि चीजों को थोड़ा सा साफ़ करता है :)

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