2013-10-13 9 views
12

मैं setters और getters के साथ एक वस्तु बनाने के लिए कोशिश कर रहा हूँ, और यह मेरा कोड है:Google क्रोम ऑब्जेक्ट.defineProperty में गलत व्यवहार?

var Player = function(height){ 
    var _height = height; 

    Object.defineProperty(this, 'height', { 
     enumerable: false 
    , configurable: true 
    , writable: false 
    , get: function(){return _height;} 
    , set: function(val){_height = val;} 
    }); 
} 

वर MyPLAYER = नए प्लेयर (10);

हालांकि defineProperty विकल्पों में से writable संपत्ति गलत पर सेट है, मैं निम्नलिखित त्रुटि मिलती है:

Invalid property. A property cannot both have accessors and be writable or have a value, #<Object>

जब writable निश्चित रूप से सही पर सेट है एक ही हो रहा है, लेकिन त्रुटि अगर मैं writable लाइन हटा देता हूं तो गायब हो जाता है।

क्या मैं कुछ गलत कर रहा हूं, या यह एक बग है? यह गूगल क्रोम पर हो रहा है, संस्करण 30.0.1599.66

+1

त्रुटि वर्णनात्मक प्रतीत होती है ... आपके पास एक गैर-लेखन योग्य संपत्ति के लिए गेटर और सेटर क्यों होगा? – elclanrs

+1

त्रुटि दोनों मामलों में प्रदर्शित हो रही है, 'लिखने योग्य: सत्य' और 'लिखने योग्य: झूठी'। क्या यह अजीब नहीं है? – Loupax

+1

आप या तो केवल 'लिखने योग्य' और 'मान' या' get' और 'set' गुणों को प्राप्त कर सकते हैं, उनमें से कोई मिश्रण नहीं। चूंकि आप 'लिखने योग्य' निर्दिष्ट करते हैं, इसलिए आप 'get' या' set' का उपयोग नहीं कर सकते हैं। [मोज़िला एमडीएन] देखें (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) –

उत्तर

32

Object.defineProperty के लिए Mozilla MDN इस स्पष्ट किया:

Property descriptors present in objects come in two main flavors: data descriptors and accessor descriptors. A data descriptor is a property that has a value, which may or may not be writable. An accessor descriptor is a property described by a getter-setter pair of functions. A descriptor must be one of these two flavors; it cannot be both.

इसका मतलब यह है, कि आप उन में से एक का उपयोग कर सकते:

  • writable और value
  • get और set

लेकिन आप उनमें से किसी भी संयोजन का उपयोग नहीं कर सकते हैं। आपके उदाहरण में, आप writable विशेषता निर्दिष्ट करते हैं, जिसका अर्थ है कि यह एक डेटा डिस्क्रिप्टर है, जो get और set विशेषताओं को अस्वीकार करता है।

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