On the MDN strict mode reference page es sagtseltsames Verhalten mit ‚use strict‘ und nur Eigenschaften
Jede Zuordnung lesen, die in normalen Code nicht stumm (Zuordnung zu einer nicht beschreibbaren Eigenschaft, die Zuordnung zu einer Getter-Unterkunft, die nur die Zuordnung zu eine neue Eigenschaft auf einer nicht erweiterbaren Objekt) wird
So im Strict-Modus werfen, ihr Beispiel unter Verwendung von nach so etwas wie das tun ein Auslöser Typeerror
"use strict";
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // throws a TypeError
Allerdings stieß ich auf ein Beispiel, wo es scheint, 'verwenden Sie streng' ist ein wenig übereifrig über diese Regel. Hier ist mein Setup
definelol.js
Object.defineProperty(Object.prototype, 'lol', {
value: 'wat'
})
setlol.js
'use strict';
console.log('here 0');
var sugar = { lol: '123' }
console.log('here 1');
var verbose = {};
verbose.lol = '123';
console.log('here 2');
console.log('sugar.lol:', sugar.lol);
console.log('verbose.lol:', verbose.lol);
console.log('Object.prototype.lol:', Object.prototype.lol);
app.js
require('./definelol.js');
require('./setlol.js');
Runnin node app.js
g gibt
here 0
here 1
/pathto/setlol.js:10
verbose.lol = '123';
^
TypeError: Cannot assign to read only property 'lol' of #<Object>
at Object.<anonymous> (/pathto/setlol.js:10:13)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/pathto/app.js:2:1)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
Es gibt ein paar interessante Dinge, die über diese Ausgabe interessant sind. Erstens versuchen wir nicht, die lol
Eigenschaft auf Object.prototype
zu setzen, wir versuchen, die lol
Eigenschaft von verbose
zu setzen. Ich definelol.js
Object.defineProperty(Object.prototype, 'lol', {
writable: true,
value: 'wat'
})
Nun node app.js
gibt
here 0
here 1
here 2
sugar.lol: 123
verbose.lol: 123
Object.prototype.lol: wat
Das zweite, was zuvor ausgeführt werden geändert, dies zu beweisen, die interessant war, dass das ursprüngliche Programm auf verbose.lol = '123'
scheiterte aber war vollkommen glücklich sugar
Erstellen und Einstellen seiner lol
zu 123. Ich verstehe das nicht, weil es scheint, dass die Art, wie wir sugar
erstellt haben, einfach syntaktischer Zucker sein sollte für die Art, wie wir verbose
Haben Sie Gedanken darüber, warum die 'sugar.lol' anders behandelt wird? – Tom
@Tom Nun, das ist es, was mich denken lässt, dass etwas Fischiges vor sich geht. Allerdings weiß ich nicht, welches Verhalten "falsch" genannt werden soll :) – Pointy
@Tom könnte es sein, dass die "Zucker" -Ding funktioniert, weil die Objekt-Literalausdrücke definiert sind. Wenn Eigenschaften auf diese Weise definiert sind, sagt die Spezifikation explizit, dass [[DefineOwnProperty]] 'aufgerufen wird. – Pointy