2015-11-29 7 views
7
function funcObj() { } 
funcObj.prototype.greet = "hello"; 
console.log(funcObj.greet) // undefined ??? 
console.log(funcObj.prototype.greet) // hello 

var obj = new funcObj(); 
console.log(obj.greet); // hello 

प्रोटोटाइप में मेरी समझ के अनुसार। यदि आप किसी ऑब्जेक्ट के किसी सदस्य के सदस्य तक पहुंचते हैं तो उसे उस ऑब्जेक्ट में उपलब्ध नहीं होने पर प्रोटोटाइप ऑब्जेक्ट से प्राप्त होगा।फ़ंक्शन ऑब्जेक्ट प्रोटोटाइप

मेरे सवालों का है:

के बाद से जावास्क्रिप्ट में कार्य वस्तुओं रहे हैं क्यों funcObj.greet -> अपरिभाषित, लेकिन obj.greet -> हैलो?

+0

केवल रचनाकार कार्यों में '.prototype' संपत्ति होती है, जिसका उपयोग तब किया जाता है जब आप उन्हें 'नया' कहते हैं। सभी ऑब्जेक्ट्स में * प्रोटोटाइप * होता है, लेकिन यह एक संपत्ति नहीं है। – Bergi

उत्तर

2

एक प्रोटोटाइप एक वस्तु है जहाँ से उदाहरणों गुण वारिस से ज्यादा कुछ नहीं है।

तो, funcObj एक अन्य प्रोटोटाइप का एक उदाहरण है (Function में से एक) जिसमें से यह सभी गुणों को विरासत में मिला है। इसके अलावा, इसके लिए आपके पास prototype है जिसके लिए आप जो कुछ भी चाहते हैं उसे बांध सकते हैं और funcObj (यानी, जब आप इसे कीवर्ड्स के साथ new funcObj() के रूप में आमंत्रित करते हैं) के नए उदाहरण बनाने के लिए इसे आमंत्रित करने के बाद प्रोटोटाइप का उपयोग किया जाएगा।

इसके कारण, यह पूरी तरह से सामान्य है कि funcObj में greet नामक सदस्य नहीं है, जबकि इसके उदाहरण हैं।

+0

इसलिए प्रत्येक फ़ंक्शन ऑब्जेक्ट फ़ंक्शन कन्स्ट्रक्टर से एक उदाहरण है। इसलिए यदि मैं अपनी प्रॉपर्टी को Function.prototype में जोड़ता हूं तो यह सभी फ़ंक्शन इंस्टेंस द्वारा साझा किया जाएगा, है ना? – Vignesh

+0

अधिक या कम। असल में, जिस दायरे को फ़ंक्शन बाध्य किया गया है, वह वर्तमान * यह * संदर्भ है। – skypjack

0

क्योंकि समारोह एक अलग वस्तु उदाहरण से है।

एक वस्तु पर एक संपत्ति लाना किसी अन्य वस्तु को प्रभावित नहीं करेगा; उस ऑब्जेक्ट या प्रोटोटाइप का एक उदाहरण भी नहीं है।

0

एक class Foo की तरह बहुत एक new Foo के रूप में एक ही प्रकार के ही नहीं है, वहाँ Foo के लिए कोई भी ऐसे गुण Foo.prototype को असाइन करने के लिए कोई कारण नहीं है। कारणों थोड़ा अलग हैं, लेकिन जावा की तरह किसी अन्य भाषा में यह विचार करें और यह स्पष्ट नहीं है कि आप क्या करने की कोशिश कर रहे हैं क्या सिर्फ काम नहीं करना चाहिए:

class Foo { 
    public String bar = "analogous to Foo.prototype.bar which is a property of Foo instances"; 
} 

class Baz { 
    String thisMethodShouldAndWillFail() { 
     return Foo.bar; 
    } 
    String thisIsWhatShouldAndWillWork() { 
     return (new Foo()).bar; 
    } 
} 

जावास्क्रिप्ट में, आप क्या एक के अपने विचार को सही करने की जरूरत है प्रोटोटाइप यह है और यह वस्तुओं और रचनाकारों से कैसे संबंधित है, या आप निरंतर समस्याओं में भाग लेंगे। एक foo एक प्रोटोटाइप है, लेकिन है कि प्रोटोटाइप नहींfoo.prototype है। नहींfoo की संपत्ति है जो इसका प्रोटोटाइप है। foo के प्रोटोटाइप अपने निर्माताFoo से निर्धारित होता है; यह इस तरह से अधिक समझ में आता है क्योंकि आप इसे बनाने के बाद foo.prototype पर कोई पुराना मान असाइन कर सकते हैं, जो foo को उस वर्ग के उदाहरण में बदलकर तोड़ देता है जिसके लिए इसे प्रारंभ नहीं किया गया था।

निर्माता Foo इसी तरह कोई मतलब नहीं होता अगर यह वर्ग में परिभाषित करता है का एक उदाहरण के रूप में कार्य करेगा; इसे अपने आप में शामिल नहीं किया गया है, इसलिए यह सुरक्षित रूप से ग्रहण नहीं किया जा सकता है कि यह अपने उदाहरणों के लिए किए गए व्यवहार को पूरा करेगा। FooFunction का एक उदाहरण है, जो समझ में आता है क्योंकि इसे कहा जा सकता है। इसलिए प्रोटोटाइप FooFunction.prototype, Foo.prototype नहीं है।

foo के बीच संबंध और इसके प्रोटोटाइप को सेट किया जाता है जब आप foo = new Foo पर कॉल करते हैं।चूंकि कन्स्ट्रक्टर Foo के शरीर को उदाहरण शुरू करने की उम्मीद है, यह केवल समय है foo इसके प्रोटोटाइप को समझ में आता है। प्रोटोटाइप एक वस्तु को अपने सामान्य व्यवहार प्रदान करता है, कन्स्ट्रक्टर ऑब्जेक्ट को प्रारंभ करता है ताकि ये व्यवहार इरादे के अनुसार काम करेंगे। प्रोटोटाइप जिसे foo पर new Foo के माध्यम से बनाया गया है, Foo.prototype के अलावा कोई अन्य नहीं है; Foo को सुविधा के लिए निष्पादित किया गया है और यह गारंटी है कि इसे संभवतः गड़बड़ नहीं किया जा सकता है। इसके बाद, के प्रोटोटाइप तक पहुंचने का कोई तरीका नहीं है, बिना Foo स्पष्ट रूप से।

enter code here 
संबंधित मुद्दे