2012-09-30 9 views
14

यह अक्सर कहा जाता है कि हर जावास्क्रिप्ट वस्तु एक prototype संपत्ति है, लेकिन मुझे लगता है foo.prototype एक मूल्य केवल तभी foo एक समारोह है है।ऐसा कहा जाता है कि सभी जावास्क्रिप्ट ऑब्जेक्ट्स में प्रोटोटाइप प्रॉपर्टी होती है, लेकिन अगर फू एक फ़ंक्शन है तो मुझे केवल foo.prototype दिखाई देता है?

क्रोम और फ़ायरफ़ॉक्स पर, obj.__proto__ का मूल्य है - क्या यह कहा गया है prototype संपत्ति? लेकिन आईई 9 पर, यह काम नहीं करेगा (क्या कोई तरीका है जो कर सकता है?), और मैंने prototype संपत्ति द्वारा सोचा, इसका मतलब है कि obj.prototype काम करना चाहिए?

मुझे लगता है कि Object.getPrototypeOf(obj) यह prototype संपत्ति दिखाना प्रतीत होता है, लेकिन इसे पाने के लिए एक विशेष विधि की आवश्यकता क्यों है? person.name की तरह क्यों नहीं, nameperson ऑब्जेक्ट की संपत्ति प्राप्त करने के लिए है?


अपडेट: (इस विधि में प्रो जावास्क्रिप्ट है: वैसे, obj.constructor.prototype लगता है कभी कभी कि प्रोटोटाइप हो, लेकिन कभी कभी नहीं, निम्नलिखित कोड कोई निर्माता के साथ मूलरूप विरासत के साथ किया के रूप में हार्मेस और Diaz द्वारा डिजाइन पैटर्न पुस्तक अप्रेस 2008 तक, पी। 46)

var Person = { 
    name: 'default value', 
    getName: function() { 
     return this.name; 
    } 
} 

var reader = clone(Person); 
console.log(reader.getName()); 
reader.name = "Ang Lee"; 
console.log(reader.getName()); 

function clone(obj) { 
    function F() {}; 
    F.prototype = obj; 
    return new F; 
} 

console.log("the prototype of reader is", Object.getPrototypeOf(reader)); 

console.log(Object.getPrototypeOf(reader) === reader.constructor.prototype); 
console.log(Object.getPrototypeOf(reader) == reader.constructor.prototype); 

console.log(Object.getPrototypeOf(reader) === reader.__proto__); 
console.log(Object.getPrototypeOf(reader) == reader.__proto__); 

परिणाम, झूठी झूठी, सच है, पिछले 4 लाइनों के लिए सच दिखाई देगा।

+2

ऑब्जेक्ट्स सभी प्रोटोटाइप से संबंधित हैं, लेकिन एक दृश्यमान संपत्ति द्वारा जरूरी नहीं है। दूसरे शब्दों में, जावास्क्रिप्ट रनटाइम आंतरिक पता है कि प्रोटोटाइप ऑब्जेक्ट क्या है, लेकिन यह आपके कोड के लिए यह निर्धारित करना संभव नहीं है कि यह क्या है। * क्यों * यह सच है, ठीक है, यह वही तरीका है जिस पर जावास्क्रिप्ट लागू किया गया था। – Pointy

+2

कोई भी जो "हर जावास्क्रिप्ट ऑब्जेक्ट में प्रोटोटाइप प्रॉपर्टी" कहता है, आंतरिक संपत्ति का जिक्र कर रहा है (जैसा आपने उल्लेख किया है, अधिकांश ब्राउज़र पर '__proto__' के रूप में उजागर)। –

+1

इस समान प्रश्न पर एक नज़र डालें: http://stackoverflow.com/questions/9451881/ –

उत्तर

13

हर जावास्क्रिप्ट वस्तु एक आंतरिक "प्रोटोटाइप" है संपत्ति, अक्सर [[प्रोटोटाइप]] कहा जाता है, जो वस्तु यह सीधे विरासत से दूर करने के लिए इंगित करता है। यह गैर मानक __proto__ संपत्ति द्वारा एफएफ और क्रोम में उजागर किया गया है। Object.getPrototypeOf इस आंतरिक संपत्ति के लिए एक गेटर है।

प्रत्येक जावास्क्रिप्ट फ़ंक्शन [ऑब्जेक्ट] में एक संपत्ति prototype है, जिसे एक [लगभग] खाली वस्तु के साथ प्रारंभ किया गया है। जब आप एक निर्माता के रूप में यह फोन करके इस समारोह का एक नया उदाहरण बनाने के लिए, निर्माता के prototype वस्तु को इंगित करेंगे [[प्रोटोटाइप]] कि नई वस्तु की।

यदि आपको किसी फ़ंक्शन का [[प्रोटोटाइप]] मिलता है (प्रत्येक फ़ंक्शन एक ऑब्जेक्ट होता है, तो इसमें एक होता है), इसके परिणामस्वरूप Function.prototype ऑब्जेक्ट का परिणाम होगा जिससे कार्य उनके तरीकों का वारिस (जैसे बाइंड, कॉल, इत्यादि))। उस पर Why functions prototype is chained repeatedly? भी देखें।

+0

जैसे कुछ" आपका "खाली ऑब्जेक्ट का मतलब है? कैसे आप वर्ग कोष्ठक में डाल आते हैं? –

+4

लगभग खाली ऑब्जेक्ट में एक गैर-गणना योग्य गुण 'कन्स्ट्रक्टर' है, जो कि कन्स्ट्रक्टर फ़ंक्शन को इंगित करता है। डबल स्क्वायर-ब्रैकेट के साथ संकेत [आधिकारिक एक्मास्क्रिप्ट विनिर्देश] (http://ecma-international.org/ecma-262/5.1/#sec-8.6.2) से आता है जो सभी आंतरिक गुणों के लिए इस प्रारूप का उपयोग करता है। – Bergi

+0

आपके जैसे "सिंगल" ब्रैकेट नोटेशन के बारे में क्या? [लगभग] खाली –

3

यह prototype पर प्रत्येक ऑब्जेक्ट का constructor है। तो कुछ foo, bar या foobar के लिए:

var foo = {}; 
console.log(foo.constructor.prototype); //=> Object 
var bar = 5; 
console.log(bar.constructor.prototype); //=> Number 
function Foobar(){} 
var foobar = new Foobar; //Foobar used a constructor 
console.log(foobar.constructor.prototype); //=> Foobar 
+0

अहा, कभी कभी निर्माता तरीका काम नहीं करेगा ऐसा लगता है, 能量 इसलिए आपको देखते हैं बल्कि विवादित –

+0

में अपडेट हुआ @ 動靜जब लोग प्रोटोटाइप विरासत करते हैं तो लोग मैन्युअल रूप से कन्स्ट्रक्टर को अद्यतन करते हैं ... '(F.prototype = obj) .constructor = F; ' –