2013-02-28 13 views
10

Vorrei definire una proprietà javascript usando un descrittore di proprietà che ha attributi personalizzati, in altre parole attributi diversi dal "valore" standard, "scrivibile", ecc ... in basso, ad esempio, ho definito una proprietà con un descrittore di proprietà che ha l'attributo personalizzato "customAttr". la chiamata a Object.defineProperty funziona bene, ma più tardi quando cerco di eseguire il loop sugli attributi del descrittore di proprietà, il mio attributo personalizzato non è elencato. È quello che sto cercando di fare? Graziei descrittori di proprietà javascript supportano attributi personalizzati?

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

Per interessi, perché vuoi farlo? –

+0

hi james ... per favore vedi il commento che ho inserito sotto sotto la tua risposta ... in fase di esecuzione vorrei riaggiungere tutte le proprietà dell'oggetto, controllare per vedere quali sono "decorati" con determinati attributi, e in base a l'esistenza, l'assenza e i valori di tali attributi, quindi procedere a fare "cose" come la convalida della proprietà ... grazie ancora per la risposta – user2073948

risposta

7

No, non è possibile. Questo è ciò che fa Object.defineProperty:

...

  3. Diamo disc essere il risultato della chiamata ToPropertyDescriptor con Attributi come argomento.

  4. Chiamare la [[DefineOwnProperty]] metodo interno di O con argomenti nome, disc, e vero.

  5. Ritorno O.

E insomma, ToPropertyDescriptor ignora semplicemente tutto ciò che non è "enumerabile", "scrivibile", "configurabile", "valore", "get" o "set":

  1. . ..

  2. Let desc essere il risultato della creazione di un nuovo descrittore di proprietà che inizialmente non ha campi.

  3. Se il risultato della chiamata al metodo interno [[hasProperty]] di Obj con l'argomento "enumerable" è vero, allora
    • ...

(ripetere il punto 3 per altre proprietà del descrittore valido)

  10. Ritorno desc.

+2

grazie ... che peccato ... ci devono essere dei buoni motivi per questo limitazione credo ... ma chiude la porta a molte cose ... sto attualmente generando il codice JS dal codice C#. Ho delle proprietà C# che sono decorate con attributi ... vorrei portare questi attributi al codice JS ... quando ho guardato prima i descrittori di proprietà JS, ero come "eccellente, questo è proprio quello di cui ho bisogno" .. oh, va bene ... adoro ancora il JS però ... – user2073948

1

Resuscitare un vecchio post qui, ma ho trovato l'idea interessante. È possibile estrarre il fatto che le funzioni sono oggetti in JavaScript, e utilizzare la funzione get in qualità di titolare di attributo:

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); 
} 

Poi:

var obj = { 
    text: 'value', 
    number: 256 
} 

setPropertyAttribute(obj, 'text', 'myAttribute', 'myAttributeValue'); 

var attrValue = getPropertyAttribute(obj, 'text', 'myAttribute'); //'myAttributeValue' 

violino here.

Problemi correlati