2012-07-27 23 views
6

जावास्क्रिप्ट में अभी शुरुआत होने के नाते, मैं यहाँObject.create विधि जावास्क्रिप्ट में

https://developer-new.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

उदाहरण कोड में से Object.create (समझने के लिए) विधि की कोशिश की, लाइन 18. एक एक्सेसर गुण के साथ बनाई गई है लिखने योग्य सेट सही है। मैंने यह भी पढ़ा कि लिखने योग्य केवल डेटा वर्णनकर्ताओं के लिए है।

कोशिश चल रहा है,

var o = Object.create(Object.prototype, { 
    // foo is a regular "value property" 
    foo: { 
    writable:true, configurable:true, value: "hello" 
    }, 
    // bar is a getter-and-setter (accessor) property 
    bar: { 
    writable: true, 
    configurable: false, 
    get: function() { return 10 }, 
    set: function(value) { console.log("Setting `o.bar` to", value) } 
    } 
    }); 
console.log(o); 

मैं invalid property error मिलता है।

+0

मोज़िला संदर्भ गलत है? – John

+0

मोज़िला संदर्भ वास्तव में गलत था। यह एक विकी है, इसलिए मैंने अभी लॉग इन किया है और इसे ठीक किया है। (वे बहुत जल्द एक नई विकी को घुमा रहे हैं, इसलिए आपको बीटा में नामांकित होने के आधार पर अभी तक ठीक नहीं दिख रहा है, मुझे लगता है।) – apsillers

उत्तर

12

समस्या यह है कि writable और set/get परस्पर अनन्य हैं।

Invalid property. A property cannot both have accessors and be writable... 

यह कुछ तार्किक समझ में आता है: कोड क्रोम में यह सहायक त्रुटि उत्पन्न करता है, तो आप एक संपत्ति पर set/get accessors है, कि संपत्ति कभी नहीं करने के लिए लिखित और/या पढ़ने के लिए से जा रहा है, क्योंकि किसी भी, इसे पढ़ने/लिखने के प्रयासों को एक्सेसर फ़ंक्शंस द्वारा अवरुद्ध कर दिया जाएगा। यदि आप एक संपत्ति को परिभाषित तो writableऔर देने के रूप में यह काम करता है accessor, आप एक साथ ही कह रहे हैं:

  1. "इस संपत्ति के मूल्य सीधे बदला जा सकता है," और पढ़ सकते हैं और करने के लिए
  2. "ब्लॉक के लिए सभी प्रयास/या इस संपत्ति को लिखें; इसके बजाय, इन कार्यों का उपयोग करें। "

त्रुटि आपको एक विरोधाभास निर्दिष्ट करने से रोक रही है। मैं इस तथ्य से मानता हूं कि आपने गेटर और सेटर लिखा है, आप वास्तव में संपत्ति को writable नहीं चाहते हैं। बस उस रेखा को हटा दें, और आपका कोड पूरी तरह से चलता है।

+1

+1। 'बार' से 'लिखने योग्य: सत्य' बिट को हटाएं, और यह ठीक है। – Amadan

+0

मुझे लगता है कि मोज़िला संदर्भ गलत है। – John

+0

@ जॉन आप ईसीएमएस्क्रिप्ट 5 के बारे में जॉन रेसिग ब्लॉग पोस्ट में रुचि ले सकते हैं: http://ejohn.org/blog/ecmascript-5-objects-and-properties/ –

10

देर से जवाब, वोटों की तलाश नहीं, लेकिन उम्मीद है कि यह सहायक होगा।

दो प्रकार के गुण हैं।प्रत्येक संपत्ति है या तो:

  1. एक डेटा संपत्ति जो इन चार गुण है:

    • मूल्य
    • लिखने योग्य
    • गणनीय
    • विन्यास
  2. या एक एक्सेसर गुण जो इन चार गुण है:

    • सेट
    • गणनीय
    • विन्यास

मिलता इसलिए वहाँ कोई संपत्ति दोनों हो सकता है है get और writable। जावास्क्रिप्ट ही यही तरीका है! कृपया गोरी के विवरण के लिए ECMAScript Standard की धारा 8.6 देखें।

+0

यह उत्तर मेरे लिए बहुत उपयोगी था। मुझे वही त्रुटि मिल रही थी, भले ही मैं झूठ बोलने के लिए लिखने योग्य था। अब मैं समझता हूं, क्योंकि मैंने 'पाने' को परिभाषित किया था, संपत्ति 'एक्सेसर प्रॉपर्टी' थी और इसलिए 'लिखने योग्य' के लिए कोई मूल्य निर्धारित करना अवैध है (भले ही आप इसे गलत पर सेट करें) –