Javascript 是否可以自动密封JS对象?
我想在创建JavaScript对象后立即对其进行密封:Javascript 是否可以自动密封JS对象?,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,我想在创建JavaScript对象后立即对其进行密封: 'use strict'; class Test { } const t = Object.seal(new Test()); t.p = true; // error! 有没有一种方法可以自动完成,比如下面 Test.sealInstances = true // I wish sealInstances was real! const t = new Test(); t.p = true; // error 我知道我可以做到:
'use strict';
class Test {
}
const t = Object.seal(new Test());
t.p = true; // error!
有没有一种方法可以自动完成,比如下面
Test.sealInstances = true // I wish sealInstances was real!
const t = new Test();
t.p = true; // error
我知道我可以做到:
function createTest() {
return Object.seal(new Test())
}
并在任何地方使用
createTest
,但我更喜欢new Test()
语法。只需将Object.seal
放在构造函数中:
“严格使用”;
课堂测试{
构造函数(){
对象.印章(本);
}
}
常数t1=新测试();
常数t2=新测试();
试一试{
t1.p='p';
}catch(e){console.log(e.message)}
试一试{
t2.z='z';
}catch(e){console.log(e.message)}
有趣的是,它需要'use strict'
这样抛出。是否在任何地方需要/记录它?是的,请参阅-尝试删除或向密封对象添加属性,或将数据属性转换为访问器,或反之亦然,都将失败,要么以静默方式失败,要么抛出TypeError(在严格模式代码中,最常见的情况是,尽管不是唯一的)。因此,use strict
会导致显式错误,而sloppy模式会导致无声故障实际上,工厂功能看起来更干净。使用构造函数中的seal
,您将无法再扩展类。@georg,在我的例子中,Test
是从模块导出的。你认为出口工厂是个好主意吗?我犹豫不决的是,我会失去一个方便的语法,比如const{Test}=require('testModule')
。为什么,const{createTest}=require(…)
?@georg,的确,没有什么问题:)也许我会坚持下去,谢谢!