2013-06-21 17 views
5

Ta długa strzał ...Jak mogę rzucić błąd podczas uzyskiwania dostępu do klucza obiektu, który nie istnieje?

w JavaScript, miałem dostęp do atrybutu obiektu, który byłem pewien istniał, ale miałem literówka był w nazwę klucza, więc wracał undefined i tworzenie błąd .

W jaki sposób mogę napisać kod równoważny do następującego, ale który zgłasza błąd, ponieważ klucz nie istnieje?

var obj = {'myKey': 'myVal'}, 
    val = obj.myKye; 

Staram się znaleźć rozwiązanie, które nie wymaga mnie pisanie funkcji otoki, że używam za każdym razem gdy chcesz uzyskać dostęp do elementu obiektu. Czy to możliwe? Czy w JavaScript istnieje inna "bardziej rygorystyczna" technika uzyskiwania dostępu do atrybutów obiektów?

+0

Czy próbujesz utworzyć obiekt lub uzyskać obiekt formularza wartości ... a twój mrówkowy obiekt jest nieprawidłowy .. sprawdź go .. – tamilmani

+0

Występuje błąd składniowy z nawiasu zamykającego podczas tworzenia 'obj', powinno być'} 'i nie ')' –

+0

może używać 'prototype' pomaga. –

Odpowiedz

-1

Można użyć try-catch, hasOwnProperty i utworzyć ReferenceError.

var obj = { 
     'myKey': 'myVal' 
}, val; 

try { 
    if(obj.hasOwnProperty(myKye)) 
    { 
     val = obj.myKye; 
     alert(val); 
    } 

    else{ 
     var ex = new ReferenceError() 
    } 
} 
catch(ex) { 
    alert(ex); 
} 

Test Link

UPDATE:

obj.myKye powraca undefined a nie wyjątek, ponieważ

To specyfikację języka JS.

Objects return undefined for undefined property names, ale undefined variable references throw an error

+1

Nie jestem pewien, czy podążam tą drogą - cały problem polega na tym, że odwołanie do obiektu obj.myKye * nie powoduje błędu. Próbuję zmusić go do zgłoszenia błędu, a nie do obsługi błędów. – Trindaz

+0

Ponieważ jest to specyfikacja języka "JS". Obiekty zwracają wartość undefined dla niezdefiniowanych nazw właściwości, ale niezdefiniowane referencje zmiennych powodują błąd. –

+0

Dlaczego upadek? –

0

Spróbuj tego:

function invalidKeyException(message) { 
    this.message = message; 
    this.name = "invalidKeyException"; 
} 

var obj = {'myKey': 'myVal'}, 
val = obj.myKye; 
if (val == undefined) 
    throw new invalidKeyException("Key does not exist."); 

JSFiddle: http://jsfiddle.net/r2MM4/

(Spójrz na konsoli)

+2

Spróbuj 'obj = {" myKey ": undefined}' ... –

1

nie można ...

Jeśli chcesz być bardzo ostrożny, hasOwnProperty pozwoli Ci sprawdzić, czy właściwość jest zdefiniowana.

function GetSafe(obj, propertyName) 
{ 
    if (obj.hasOwnProperty(propertyName)) return obj[propertyName]; 
    return "Unknown property:"+ propertyName; // throw or some other error reporting. 
} 
var obj = {'myKey': 'myVal'}; 
alert(GetSafe(obj, "myKey")); 
alert(GetSafe(obj, "myKye")); 
+0

Jeśli chcesz być bardzo ostrożny, użyjesz 'Object.prototype.hasOwnProperty.call (obj, propertyName)' :-) – Bergi

+0

@Bergi:) także gdybym chciał być tak ostrożny, użyłbym Skryptu # –

0

Można spróbować następujących sposobów:

1) za pomocą typeof:

try { 
    var obj = {'myKey': 'myVal'}, val; 

    if(typeof (obj.myKye) === 'undefined') 
    { 
     var e = new NotImplementedError("NotImplementedError Your_message"); 
     throw e; 
    } 
    else 
    { 
    val = obj.myKye; 
    }  
    alert(val); 
    } 
catch(e) 
    { 
    alert(e); 
    } 

2) Korzystanie obj.hasOwnProperty(prop):

try { 
    var obj = {'myKey': 'myVal'}, val; 

    if(obj.hasOwnProperty(myKye)) 
    { 
    val = obj.myKye; 
    } 
    else 
    { 
     throw 'Property undefined'; 
    } 
    alert(val); 
    } 
catch(e) 
    { 
    alert(e); 
    } 
+0

To nie jest całkowicie poprawne - "niezdefiniowane" jest możliwą wartością (rzadko, ale nadal): 'obj = {" myKey ": undefined}' jest poprawnym obiektem z właściwością 'myKey'. –

+0

@AlexeiLevenkov: Zaktualizowano moją odpowiedź ... –

+1

:) jest dokładnie taka sama jak poprzednio - 'typeof (undefined) ===" undefined "', tylko dłużej. Nota boczna '===' jest lepsza, jeśli wiesz, że typy muszą się zgadzać (jak w przypadku 'typeof'). –

2

rozwiązanie, które nie wymaga ja piszę funkcję otoki, której używam za każdym razem chcesz uzyskać dostęp do elementu obiektu. Czy to możliwe? Czy w JavaScript istnieje inna "bardziej rygorystyczna" technika uzyskiwania dostępu do atrybutów obiektów?

Nie. Można użyć modelu Proxy, który został zaprojektowany w taki sposób, aby działał dokładnie tak, jak chcesz. Jest to jednak tylko szkic, a obecnie tylko supported in Firefox' Javascript 1.8.5 (FF18 +).

Nie ma innej możliwości posiadania domyślnej funkcji gettera dla wszystkich dostępów do nieruchomości. Będziesz musiał go jawnie zakodować.

Powiązane problemy