JavaScript原型上的Object.freeze()有问题吗?

JavaScript原型上的Object.freeze()有问题吗?,javascript,object,prototype,Javascript,Object,Prototype,在JavaScript中对构造函数的原型调用Object.freeze有什么问题吗 我只是在想,既然原型在所有实例中共享,也许我可以确保没有人通过冻结原型来覆盖原型中的任何内容,因为覆盖原型上的某些内容会影响每个实例。例如,类似于以下内容: function MyConstructor() { // Stuff } MyConstructor.prototype = { method1() { // more stuff }, method2() { // ev

在JavaScript中对构造函数的原型调用
Object.freeze
有什么问题吗

我只是在想,既然原型在所有实例中共享,也许我可以确保没有人通过冻结原型来覆盖原型中的任何内容,因为覆盖原型上的某些内容会影响每个实例。例如,类似于以下内容:

function MyConstructor() {
  // Stuff
}

MyConstructor.prototype = {
  method1() {
    // more stuff
  },
  method2() {
    // even more stuff
  },
  someArray: ['some', 'values'],
  someValue: 'value'
}

Object.freeze(MyConstructor.prototype);

如果冻结原型,也会冻结扩展原型的对象,因此它们将无法覆盖原型中定义的属性


这是一个展示问题的测试

我想你真正想要的是

MyConstructor.prototype.someArray = Object.freeze(['some', 'values']);

几乎没有必要冻结原型对象本身,没有任何东西会意外地覆盖原型属性。但是,使继承值不可变可能很有用,因为意外突变更容易发生,并导致相同的有害影响。

是的,您不能简单地将这些属性赋值。但是不,继承对象没有冻结,您仍然可以通过使用
Object.defineProperty
.True来创建阴影属性,但关键是当原型的实例在其他地方使用时冻结原型可能会导致各种问题。当然,除非事先有相应的计划。@Bergi如何“冻结”原型而不影响从原型“延伸”出来的对象?我希望对象从它“扩展”到仍然可以在不使用
defineProperty
的情况下轻松隐藏原型,但不允许修改原型本身。在这种情况下,我们是否必须手动设置描述符(例如,可配置/可写为false)?@trusktr您可以使用getter/setter来完成此操作,而不是将
writeable
设置为false。@Bergi我希望不允许直接写入原型,但允许写入“扩展”对象(让他们对原型进行阴影处理)。这是只有使用代理才能实现的,还是有其他方法?我不知道用户将定义什么属性,所以对于getter/setter,我必须保留一个单独的WeakMap,以便在将非getter/setter道具转换为getter/setter后保存这些值。看起来可能过于复杂了。