2013-02-28 22 views
10

Chciałbym zdefiniować właściwość javascript za pomocą deskryptora właściwości, który ma niestandardowe atrybuty, innymi słowy, atrybuty inne niż standardowa "wartość", "zapisywalny" itp. ... poniżej na przykład Zdefiniowałem właściwość z deskryptor właściwości, który ma niestandardowy atrybut "customAttr". wywołanie Object.defineProperty działa dobrze, ale później, gdy próbuję zapętlić atrybuty deskryptora właściwości, mój atrybut niestandardowy nie jest wyświetlany. Czy to, co próbuję zrobić, jest możliwe? DziękujemyCzy deskryptory własności javascript obsługują atrybuty niestandardowe?

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

Ciekawe, dlaczego chcesz to zrobić? –

+0

cześć james ... zobacz komentarz wprowadzony poniżej pod twoją odpowiedzią ... w czasie wykonywania Chciałbym zapętlić wszystkie właściwości obiektu, sprawdź, które są "udekorowane" pewnymi atrybutami i na podstawie istnienie, nieobecność i wartości tych atrybutów, a następnie przystąpić do "rzeczy", takich jak walidacja nieruchomości ... jeszcze raz dziękuję za odpowiedź – user2073948

Odpowiedz

7

Nie, to niemożliwe. To, co robi Object.defineProperty:

...

  3. Niech desc być wynikiem nazywając ToPropertyDescriptor z Atrybuty jako argumentu.

  4. Wywołanie [[DefineOwnProperty]] Metoda wewnętrzna O argumentów nazwa, desc i prawdziwe.

  5. Powrót O.

A w skrócie, ToPropertyDescriptor prostu ignoruje wszystko co nie jest "przeliczalny", "zapisu", "konfigurowalny", "wartość", "get" lub "set":

  1. . ..

  2. Niech desc będzie wynikiem utworzenia nowego deskryptora właściwości, który początkowo nie ma pól.

  3. Jeśli wynik wywołanie [[HasProperty]] Metoda wewnętrznej Obj z argumentem "enumerable" jest prawdą, to
    • ...

(powtórz krok 3 dla innych poprawnych właściwości deskryptorów)

  10. Powrót desc.

+2

dziękuję ... co za wstyd ... muszą być dobre powody do tego ograniczenie chyba ... ale zamyka drzwi do wielu rzeczy ... aktualnie generuję kod JS z kodu C#. Mam właściwości C#, które są ozdobione atrybutami ... Chciałbym przenieść te atrybuty do kodu JS ... kiedy po raz pierwszy spojrzał na deskryptory właściwości JS i było jak "doskonałe, to jest właśnie to, czego potrzebuję" .. no cóż ... nadal kocham JS chociaż ... – user2073948

1

Wskrzeszając stary post tutaj, ale pomysł okazał się interesujący. Można wyodrębnić fakt, że funkcje są obiekty w javascript i używać funkcji get jako posiadacz atrybut:

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

Następnie:

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

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

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

skrzypce here.

Powiązane problemy