2016-08-09 12 views
0

Das Buch, PROFESSIONAL JavaScript ® für Web-Entwickler Third Edition, sagt:Neudefinition Attribut über Objekteigenschaft verursacht einen Fehler

Zusätzlich einmal eine Eigenschaft hat defi niert als nicht konfigurierbare, es nicht konfigurierbar wieder werden kann. Jeder Versuch, Object.defineProperty() aufzurufen und jedes andere Attribut als das schreibbare zu ändern, verursacht einen Fehler.

'use strict'; 
 
var obj = {}; 
 
Object.defineProperty(obj, 'key', { 
 
    value:'static' 
 
}); 
 

 
Object.defineProperty(obj, 'key', { 
 
    writable: true, 
 
});

schreibe ich über einen Code-Schnipsel, aber es wirft einen Fehler. Das Buch sagt, dass ich die beschreibbaren Attribute neu definieren kann. Warum verursacht es einen Fehler?

Antwort

1

Warum verursacht es einen Fehler?

MDN says:

Wenn eine Eigenschaft nicht konfigurierbar ist, kann seine writable Attribut nur auf false geändert werden.

die Aussage in dem Buch ist also nicht genau genug: Sie können writable auf einer nicht konfigurierbaren Eigenschaft ändern, sondern nur von true zu false, nicht umgekehrt, das ist, was Sie zu tun versuchen.

0

Wenn Sie Eigenschaftsdeskriptoren in Object.defineProperty überspringen, nehmen sie stattdessen einen Standardwert an.

Im Fall des writable Beschreiber, ist der Standardwert false, das es das erste Mal hat die gleiche Wirkung wie dies bedeutet nicht einstellen:

Object.defineProperty(obj, 'key', { 
    value:'static', 
    writable: false 
}); 

Wenn Sie explizit writable zu true und erneut ausführen, die Code, Sie werden sehen, dass keine Ausnahme ausgelöst wird.

+1

Nun, um fair zu sein, gibt es keine Ausnahme, denn wenn 'writable' bereits' true', ist es nicht mit dem zweiten Aufruf geändert. Es ist ein Noop. –

+0

Ah, ja, das stimmt. Im Gegensatz zum ursprünglichen Beispiel in der Frage macht es aber immer noch Sinn, da es zeigt, dass das Problem beim ersten Aufruf entsteht. Aber du hast recht. –

1

Eine Eigenschaft kann nur von nicht beschreibbar in beschreibbar geändert werden, wenn das Attribut configurable wahr ist. (ECMA-262 7. Ausgabe, §6.1.7.1) Standardmäßig ist es falsch.

Wenn Sie Metadaten für die Eigenschaft nach dem Erstellen konfigurieren möchten, fügen Sie configurable: true zur ersten defineProperty hinzu.

'use strict'; 
 
var obj = {}; 
 
Object.defineProperty(obj, 'key', { 
 
    value:'static', 
 
    configurable: true 
 
}); 
 

 
Object.defineProperty(obj, 'key', { 
 
    writable: true, 
 
}); 
 

 
console.log(Object.getOwnPropertyDescriptor(obj, 'key'));

Verwandte Themen