【发布时间】:2023-03-19 10:08:01
【问题描述】:
On the MDN strict mode reference page 它说
任何在正常代码中静默失败的赋值(赋值给不可写属性、赋值给 getter-only 属性、赋值给不可扩展对象的新属性)都将进入严格模式
因此,使用他们的示例,执行以下操作会引发 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');
运行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)
这个输出有几个有趣的地方。首先是我们没有尝试在Object.prototype 上设置lol 属性,而是在尝试设置verbose 的lol 属性。为了证明这一点,我将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 方式的语法糖
【问题讨论】:
标签: javascript node.js use-strict defineproperty