2012-04-13 5 views
9

मैं प्रोटोटाइप को ओवरराइट करने से रोकने के लिए क्रॉकफोर्ड शिम पर पढ़ रहा हूं, और समझता हूं कि यह कभी-कभी अंत/सभी-समाधान नहीं होता है। मैं यह भी समझता हूं कि ES5 Shim इसके लिए एक व्यवहार्य विकल्प हो सकता है। मैंने this post which provides a more robust, secure alternative भी पढ़ा।क्रॉकफ़ोर्ड के ऑब्जेक्ट को समझना। क्रीम

फिर भी, मैं जानना चाहता हूं कि उसका Object.create शिम "कह रहा है" और फिर "कर रहा है।" क्या कोई मुझे बता सकता है कि मेरी स्पष्टीकरण टिप्पणियां सही हैं या नहीं?

if (typeof Object.create === 'undefined') { 
//If the browser doesn't support Object.create 

    Object.create = function (o) { 
    //Object.create equals an anonymous function that accepts one parameter, 'o'. 

    function F() {}; 
    //Create a new function called 'F' which is just an empty object. 

    F.prototype = o; 
    //the prototype of the 'F' function should point to the 
    //parameter of the anonymous function. 

    return new F(); 
    //create a new constructor function based off of the 'F' function. 
    }; 
} 

//Then, based off of the 'Lost' example in the Crockford book... 

var another_stooge = Object.create(stooge); 

//'another_stooge' prototypes off of 'stooge' using new school Object.create. 
//But if the browser doesn't support Object.create, 
//'another_stooge' prototypes off of 'stooge' using the old school method. 

इस तरह, 'कठपुतली' वस्तु के प्रोटोटाइप ओवरराइट नहीं किया जा सकता है जब हम 'another_stooge' के लिए सामान को बढ़ाने। 'कन्स्ट्रक्टर' का उपयोग करके 'स्टूज' प्रोटोटाइप को रीसेट करने की आवश्यकता नहीं है।

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

-k

उत्तर

14
if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function F() {} 
     F.prototype = o; 
     return new F(); 
    }; 
} 
var oldObject={prop:'Property_one' }; // An object 
var newObject = Object.create(oldObject); // Another object 

हम एक नई वस्तु newObject बना लिया है ऊपर के उदाहरण में create विधि Object उद्देश्य यह है कि हम अपने (Crockford के) उदाहरण में पहले Object वस्तु में जोड़ दिया है के एक सदस्य समारोह है जो इस्तेमाल करते हैं। तो मूल रूप से करता है क्या यह है कि, create विधि एक समारोह F, एक खाली वस्तु every function is a first class object in javascript वाणी और फिर हम o के प्रोटोटाइप विरासत में मिला है और अंत में (उस मामले o में भी एक वस्तु oldObject विधि बनाने के पैरामीटर के रूप में पारित कर दिया है) हमने return new F(); का उपयोग newObject पर नई ऑब्जेक्ट (एफ का एक उदाहरण) वापस कर दिया है, इसलिए अब newObject एक ऑब्जेक्ट है जो oldObject विरासत में मिला है। अब यदि आप console.log(newObject.prop); लिखते हैं तो यह Property_one आउटपुट करेगा क्योंकि हमारे newObject ऑब्जेक्ट को oldObject विरासत में मिला है और इसीलिए हमें prop का मान Property_one के रूप में मिला है। यह प्रोटोटाइपिक विरासत के रूप में जाना जाता है।

आप create विधि

+0

ए-हा! मैने सोचा कि मैंने पा लिया। धन्यवाद शेख ... आपकी मदद बहुत सराहना की है !!! – kaidez

+0

आप सबसे अधिक स्वागत करते हैं :-) –

0

सभी यह करता है एक नई वस्तु निर्माता है, जो एफ है बनाने के है, यह तो निर्माता प्रोटोटाइप संपत्ति के लिए पारित वस्तु आवंटित ताकि नई वस्तु के साथ बनाया एफ कन्स्ट्रक्टर उन तरीकों का वारिस करता है।

यह तो निर्माता का उपयोग एक नव प्रारंभ वस्तु (नए एफ() => F.prototype)

लेकिन Crockford एक वापस करने के लिए निर्माता को पुन: असाइन करने के लिए असफल ठीक से के रूप में सामान्य रूप से नई वस्तु निर्माता एक ही होना चाहिए ऑब्जेक्ट कन्स्ट्रक्टर के रूप में यह विरासत में मिलता है।

+0

हाय गिलेस्क। उत्तर देने के लिये धन्यवाद! तो जब इसका उपयोग किया जाता है, तो क्या इसका मतलब यह है कि कन्स्ट्रक्टर के प्रोटोटाइप को रीसेट करने की आवश्यकता है? कुछ ऐसा: stooge.prototype.constructor = stooge; फिर से धन्यवाद! – kaidez

0

अपनी टिप्पणी पर:

> //Object.create equals an anonymous function that accepts one parameter, 'o'. 

बेहतर कहना है कि एक समारोह Object की create संपत्ति को सौंपा गया है। सभी कार्यों को अनाम माना जा सकता है, बस कुछ को नामित गुणों या चरों को सौंपा गया है, अन्य नहीं हैं।

> //Create a new function called 'F' which is just an empty object. 

कोई फ़ंक्शन घोषित करें। हाँ, यह एक वस्तु भी है।

>  F.prototype = o; 
>  //the prototype of the 'F' function should point to the 
>  //parameter of the anonymous function. 

o का संदर्भ F.prototype को सौंपा गया है थोड़ा कम लिखने के लिए है।

>  //create a new constructor function based off of the 'F' function. 

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

यह नहीं कि कन्स्ट्रक्टर संपत्ति बहुत विश्वसनीय है या विशेष रूप से वैसे भी उपयोगी है।

इस तरह, 'कठपुतली' वस्तु के प्रोटोटाइप ओवरराइट नहीं किया जा सकता है जब हम 'another_stooge' के लिए सामान को बढ़ाने। 'कन्स्ट्रक्टर' का उपयोग करके 'स्टूज' प्रोटोटाइप को रीसेट करने की आवश्यकता नहीं है।

यह एक अजीब बयान है। * another_stooge * में stooge है क्योंकि यह निजी [[Prototype]] है, यह stooge.prototype से नहीं है लेकिन stooge.[[Prototype]] से है।

यदि आप stooge.prototype से प्राप्त करने के लिए चाहते हैं, तो Object.create(stooge.prototype) या Object.create(new stooge()) का उपयोग करें, पूर्व शायद अधिक उपयुक्त है।

मुझे उम्मीद है कि सभी समझ में आता है।

+0

हाय रॉब। उत्तर देने के लिये धन्यवाद! मुझे सिंटैक्स को पूरी तरह से समझने के लिए फिर से पढ़ना है, लेकिन मुझे निश्चित रूप से एक घंटा पहले से ज्यादा पता था। एक बार फिर धन्यवाद! – kaidez

0

के पैरामीटर के रूप में एक वस्तु से गुजरना होगा यहाँ दो चालें हैं:

  1. एफ एक सरल कार्य नहीं है, यह एक निर्माता है।
  2. "एफ.प्रोटोटाइप" सिर्फ एक संपत्ति है, यह इस पल में विरासत के साथ कुछ नहीं करता है। वास्तविक चाल यह है कि जब हम "नया एफ()" का उपयोग करते हैं, तो "नया" एक नई वस्तु बनाता है, कन्स्ट्रक्टर को कॉल करता है (जो यहां कुछ भी नहीं करता है) और नए ऑब्जेक्ट के आंतरिक "प्रोटोटाइप" फ़ील्ड को मूल्य के साथ सेट करता है "एफ। प्रोोटोटाइप", इसलिए लौटाया गया ऑब्जेक्ट "ओ" से प्राप्त होगा।

तो मुझे लगता है, कि:

  • एफ एक निर्माता
  • एफ से विरासत नहीं है ओ
  • "नए एफ '(जो लौट आए वस्तु) ओ
  • से विरासत है
-1

मैं F के बजाय Object के रूप में आंतरिक समारोह नामकरण लगता है बनाता है जिसके परिणामस्वरूप वस्तु w क्या Object.create() के करीब देखो बनाना होगा।

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function Object() {} 
     Object.prototype = o; 
     return new Object(); 
    }; 
} 
संबंधित मुद्दे