In der Regel können Sie eine Operation nicht rückgängig machen. defineProperty
Aufruf, da es keinen Rückgängig-Stapel oder ähnliches gibt. Die JS-Engine behält keine vorherigen Attributdeskriptoren im Auge.
Zum Beispiel,
Object.defineProperty(Object.prototype, 'foo', {
configurable: true,
value: 1,
enumerable: false
});
Object.defineProperty(Object.prototype, 'foo', {
get: function () {
alert('You cannot revert me');
return 2;
},
enumerable: true
});
Was Sie tun können, ist entfernen ou neu konfigurieren ein Attribut, oder überschreiben. seinen Wert. Wie in der anderen Antwort erwähnt, ist die configurable
Flagge muss sein true
wenn Sie sie entfernen oder umkonfigurieren möchten. Sobald eine Eigenschaft definiert ist mit configurable:false
können Sie die configurable
Flagge.
Um ein Attribut zu entfernen (was Sie vermutlich tun wollen), verwenden Sie delete
:
Object.defineProperty(Object.prototype, 'foo', {
configurable: true, // defaults to false
writable: false,
value: 1
});
delete Object.prototype.foo;
console.log(Object.prototype.hasOwnProperty('foo')); // false
Zum Umkonfigurieren verwenden Sie defineProperty
erneut und übergibt einen anderen Deskriptor:
Object.defineProperty(Object.prototype, 'foo', {
configurable: true,
get: ...
set: ...
});
Object.defineProperty(Object.prototype, 'foo', {
value: undefined
});
console.log({}.foo); // undefined
console.log(Object.prototype.hasOwnProperty('foo')); // true
Wie in diesem Beispiel gezeigt, können Sie Folgendes verwenden defineProperty
um zwischen Accessor ( get
/ set
) und Daten ( value
) Eigenschaften.
Zum Überschreiben verwenden Sie die einfache Zuweisung. In diesem Fall benötigen Sie die writable
Flagge zu sein true
. Offensichtlich funktioniert dies nicht mit Accessor-Eigenschaften. Es löst sogar eine Ausnahme aus:
Object.defineProperty(Object.prototype, 'foo', {
configurable: true,
value: 1,
writable: true // defaults to false
});
Object.prototype.foo = undefined;
console.log(Object.prototype.foo); // undefined
console.log(Object.prototype.hasOwnProperty('foo')); // true
Object.defineProperty(Object.prototype, 'foo', {
get: function () {
return 1;
},
writable: true // JS error!
});
Beachten Sie, dass writable
wird standardmäßig auf false
wenn Sie defineProperty
が、しかし true
wenn Sie die einfache Syntax verwenden o.attr = val;
um eine (bisher nicht vorhandene) Eigenschaft zu definieren.