2014-12-17 8 views
30

मैं निकोलस जाकास द्वारा भयानक "वेब डेवलपर्स के लिए पेशेवर जावास्क्रिप्ट" पुस्तक से यह वास्तव में सरल उदाहरण का प्रयास कर रहा था, लेकिन मुझे यह नहीं पता कि मैं यहां क्या कर रहा हूं। कुछ सचमुच सरल होना चाहिए जो मुझे याद आया लेकिन मैं फंस गया हूं।Uncaught TypeError: केवल संपत्ति को पढ़ने के लिए असाइन नहीं किया जा सकता

'use strict'; 

var book = {}; 

Object.defineProperties(book, { 
    originYear: { 
     value: 2004, 
     writable: false 
    }, 

    _year: { 
     value: 2004 
    }, 

    edition: { 
     value: 1 
    }, 

    year : { 
     get: function() { 
      return this._year; 
     }, 

     set: function(newValue) { 
      if(newValue > this.originYear) { 
       this._year = newValue; 
       this.edition += newValue - this.originYear; 
      } 
     } 
    } 
}); 

console.log(book.edition); 
book.year = 2006; 
console.log(book.edition); 

त्रुटि मैं क्रोम कंसोल पर हो रही है है:

यहाँ कोड है

Uncaught TypeError: केवल संपत्ति # main.js की '_year' को पढ़ने के लिए आवंटित नहीं कर सकता: 31 Object.defineProperties.year.setmain.js: 39 (अनाम कार्य)

क्या कोई यह बता सकता है कि मैं गलत कहां गया हूं?

यहाँ fiddle

उत्तर

25

आप Object.defineProperties उपयोग करते हैं, डिफ़ॉल्ट writable द्वारा false पर सेट किया जाता है, तो _year और edition वास्तव में कर रहे केवल पढ़ने के लिए गुण। बाहर

_year: { 
    value: 2004, 
    writable: true 
}, 

edition: { 
    value: 1, 
    writable: true 
}, 

चेक MDN for this method:

स्पष्ट रूप writable: true करने के लिए उन्हें निर्धारित किया है।

writable
true if and only if the value associated with the property may be changed with an assignment operator.
Defaults to false .

+3

उत्तर के लिए धन्यवाद क्योंकि यह मुझे मेरे समाधान में ले जाता है। मेरे पास एक चर था: 'var thisObject = {name:' name ', id: 1};' और कोड में किसी बिंदु पर मैं 'thisObject = 1' सेट कर रहा था, (मुझे लगता है कि यह पुराना कोड था या बस नहीं था ' टी इसे ठीक से लिखते हैं ... और जब मैंने 'thisObject.name' का उपयोग करने या सेट करने का प्रयास किया, तो मुझे यह त्रुटि संदेश प्राप्त हुआ। जिस पंक्ति को मैंने एक पूर्णांक में' यह ऑब्जेक्ट 'सेट किया है, उसे हटाकर मेरी समस्या तय की गई है। उम्मीद है कि इससे किसी की मदद मिलती है। – Termato

0

मैं एक अलग अवधि के लिए year बदल रहा करने की कोशिश की है, और यह काम किया।

public_methods : { 
    get: function() { 
     return this._year; 
    }, 

    set: function(newValue) { 
     if(newValue > this.originYear) { 
      this._year = newValue; 
      this.edition += newValue - this.originYear; 
     } 
    } 
} 
+0

इस की कोशिश की। लेकिन यह अभी भी _year संपत्ति के लिए असाइनमेंट का सामना करने में एक त्रुटि फेंकता है। क्या यह आपके लिए त्रुटि फेंकने के बिना असाइनमेंट निष्पादित किया गया था? धन्यवाद – Larrydx

+0

यह एक त्रुटि के बिना काम किया। –

+0

लियो का जवाब सही है। नीचे चिह्नित किया गया है क्योंकि उत्तर बग को ठीक करने के लिए यादृच्छिक रूप से परिवर्तनीय नाम बदलने का सुझाव देता है जो लापरवाही से त्रुटियों को ठीक करने और शायद अधिक बग बनाने के लिए होगा। – Larrydx

-2
book.year.writable = true; 
book.year = New Value; 
+1

=/यह काम नहीं किया: * "केवल संपत्ति 'लिखने योग्य' पढ़ने के लिए असाइन नहीं किया जा सकता है * * – falsarella

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