On the MDN strict mode reference page это говоритWeird поведение с «использовать строгий» и только для чтения свойства
Любое задание, которое молча терпит неудачу в обычном коде (присвоение незаписываемый собственности, присвоение геттерным только собственности, присвоение новое свойство на не расширяемый объект) выбросит в строгом режиме
Таким образом, используя свой пример, делать что-то вроде следующего кидает TypeError
"use strict";
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // throws a TypeError
Однако я столкнулся с примером, где кажется, что «использовать строгое» немного переоценивает это правило. Вот моя установка
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
дает
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)
Есть несколько интересных вещей, которые интересны об этом выходе. Во-первых, мы не пытаемся установить свойство lol
на Object.prototype
, мы пытаемся установить свойство lol
verbose
. Чтобы доказать это, я изменил definelol.js
быть
Object.defineProperty(Object.prototype, 'lol', {
writable: true,
value: 'wat'
})
Теперь, бег node app.js
дает
here 0
here 1
here 2
sugar.lol: 123
verbose.lol: 123
Object.prototype.lol: wat
Второе, что было интересно, что первоначальная программа не удалось на verbose.lol = '123'
, но был совершенно счастлив создание sugar
и установив его lol
до 123. Я не понимаю этого, потому что кажется, что способ, которым мы создали sugar
, должен быть просто синтаксическим сахаром для того, как мы создали verbose
Есть ли у вас какие-либо мысли о том, почему 'sugar.lol' трактуется по-разному? – Tom
@Tom Хорошо, вот что заставляет меня думать, что происходит что-то подозрительное. Тем не менее, я не знаю, какое поведение называть «неправильным» :) – Pointy
@ Возможно, это связано с тем, что «сахаристая» вещь работает из-за того, как определяются выражения объектного литерала. Когда свойства определены таким образом, спецификация явно говорит о том, что вызывается '[[DefineOwnProperty]]'. – Pointy