2013-02-28 3 views
10

मैं एक संपत्ति वर्णनकर्ता का उपयोग कर एक जावास्क्रिप्ट प्रॉपर्टी को परिभाषित करना चाहता हूं जिसमें कस्टम गुण हैं, दूसरे शब्दों में, मानक "मान", "लिखने योग्य" आदि के अलावा अन्य विशेषताएँ ... उदाहरण के लिए मैंने एक संपत्ति परिभाषित की है एक संपत्ति वर्णनकर्ता जिसमें कस्टम विशेषता "customAttr" है। ऑब्जेक्ट .defineProperty पर कॉल ठीक काम करता है लेकिन बाद में जब मैं प्रॉपर्टी डिस्क्रिप्टर के गुणों पर लूप करने का प्रयास करता हूं, तो मेरी कस्टम विशेषता सूचीबद्ध नहीं होती है। क्या मैं संभव करने की कोशिश कर रहा हूं? धन्यवादजावास्क्रिप्ट संपत्ति वर्णनकर्ता कस्टम विशेषताओं का समर्थन करते हैं?

var o = {}; 

Object.defineProperty(o, "newDataProperty", { 
               value: 101, 
               writable: true, 
               enumerable: true, 
               configurable: true, 
               customAttr: 1 
              }); 


var desc2 = Object.getOwnPropertyDescriptor(o, "newDataProperty"); 

// List the descriptor attributes. 
for (var prop in desc2) { 
    console.log(prop + ': ' + desc2[prop]);  
} 
//PROBLEM: "customAttr" is not listed 
+0

ब्याज से, आप ऐसा क्यों करना चाहते हैं? –

+0

हाय जेम्स ... कृपया नीचे दिए गए टिप्पणी को मैंने अपने उत्तर के नीचे दर्ज किया है ... रन टाइम पर मैं ऑब्जेक्ट की सभी संपत्तियों पर लूप करना चाहता हूं, यह देखने के लिए जांचें कि कौन से गुण कुछ विशेषताओं के साथ "सजाए गए" हैं, और इसके आधार पर उन गुणों का अस्तित्व, अनुपस्थिति और मूल्य, फिर संपत्ति के सत्यापन की तरह "चीजें" करने के लिए आगे बढ़ें ... उत्तर के लिए धन्यवाद – user2073948

उत्तर

7

नहीं, यह संभव नहीं है। यह वही है Object.defineProperty करता है:

...

  3. desc बुला का परिणाम ToPropertyDescriptorसाथ गुण तर्क के रूप में हो।

  4. कॉल तर्क नाम, desc, और सच के साथ हे की [[DefineOwnProperty]] आंतरिक विधि।

  5. वापसी

  1. :

और संक्षेप में, ToPropertyDescriptor बस कुछ भी है कि "गणनीय" नहीं है "लिखने योग्य", "विन्यास", "मूल्य", "प्राप्त" या "सेट" पर ध्यान नहीं देता। ..

  • desc एक नया प्रॉपर्टी डिस्क्रिप्टर बनाने का नतीजा है जिसके प्रारंभ में कोई फ़ील्ड नहीं है।

  • तो तर्क "enumerable" के साथ Objकी [[HasProperty]] आंतरिक विधि बुला का परिणाम सही है, तो
    • है ...
  • (दोहराने चरण 3 अन्य मान्य वर्णनकर्ता गुणों के लिए)

      10. वापसी desc

    +2

    धन्यवाद ... क्या शर्म की बात है ... इसके लिए अच्छे कारण होना चाहिए मुझे लगता है कि सीमा ... लेकिन यह कई चीजों के दरवाजे बंद कर देता है ... मैं वर्तमान में सी # कोड से जेएस कोड उत्पन्न कर रहा हूँ। मेरे पास सी # गुण हैं जो विशेषताओं से सजाए गए हैं ... मैं इन विशेषताओं को जेएस कोड पर ले जाना चाहता हूं ... जब मैंने पहली बार जेएस प्रॉपर्टी डिस्क्रिप्टर में देखा तो मैं "उत्कृष्ट, यह वही है जो मुझे चाहिए" .. ओह ठीक है ... फिर भी जेएस प्यार करता हूँ ... – user2073948

    1

    यहां एक पुरानी पोस्ट का पुनरुत्थान, लेकिन मुझे यह विचार दिलचस्प लगता है। आप तथ्य यह है कि कार्यों जावास्क्रिप्ट में वस्तुओं रहे हैं निकाल सकते हैं, और विशेषता धारक के रूप में get समारोह का उपयोग करें:

    function setPropertyAttribute(obj, propertyName, attributeName, attributeValue) { 
        var descriptor = getCustomPropertyDescriptor(obj, propertyName); 
    
        descriptor.get.$custom[attributeName] = attributeValue; 
    } 
    
    function getPropertyAttributes(obj, propertyName) { 
        var descriptor = getCustomPropertyDescriptor(obj, propertyName); 
    
        return descriptor.get.$custom; 
    } 
    
    function getPropertyAttribute(obj, propertyName, attributeName) { 
        return getPropertyAttributes(obj, propertyName)[attributeName]; 
    } 
    
    function getCustomPropertyDescriptor(obj, prop) { 
        var actualDescriptor = Object.getOwnPropertyDescriptor(obj, prop); 
        if (actualDescriptor && actualDescriptor.get && actualDescriptor.get.$custom) { 
        return actualDescriptor; 
        } 
    
        var value = obj[prop]; 
        var descriptor = { 
        get: function() { 
         return value; 
        }, 
        set: function(newValue) { 
         value = newValue; 
        } 
        } 
        descriptor.get.$custom = {}; 
    
        Object.defineProperty(obj, prop, descriptor); 
        return Object.getOwnPropertyDescriptor(obj, prop); 
    } 
    
    फिर

    :

    var obj = { 
        text: 'value', 
        number: 256 
    } 
    
    setPropertyAttribute(obj, 'text', 'myAttribute', 'myAttributeValue'); 
    
    var attrValue = getPropertyAttribute(obj, 'text', 'myAttribute'); //'myAttributeValue' 
    

    बेला here

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