Javascript 是否可以自动密封JS对象?

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 我知道我可以做到:

我想在创建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
我知道我可以做到:

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,的确,没有什么问题:)也许我会坚持下去,谢谢!