【问题标题】:How to prevent changes to a prototype?如何防止更改原型?
【发布时间】:2016-11-08 13:21:03
【问题描述】:

在这段代码中,原型仍然可以改变。

如何防止对原型进行更改?

var a = {a:1}
var b={b:1}
var c = Object.create(a)
Object.getPrototypeOf(c) //a
c.__proto__ = b;
Object.getPrototypeOf(c) //b
var d = Object.create(null)
Object.getPrototypeOf(d) //null
d.__proto__ = b;
Object.getPrototypeOf(d) //null

【问题讨论】:

  • 原型只是一个和其他对象一样的对象,这意味着您可以冻结/密封它。
  • __proto__ 已弃用。如果需要,请使用Object.setPrototypeOf

标签: javascript object-create


【解决方案1】:

如何防止对原型进行更改?

我假设您不是在谈论改变原型对象本身,而是覆盖现有对象的原型。

您可以使用Object.preventExtensions() 来防止这种情况:

var a = {a:1}
var b = {b:1}
var c = Object.create(a)
Object.preventExtensions(c) 
console.log(Object.getPrototypeOf(c)) //a
c.__proto__ = b; // Error

但这也意味着你不能向它添加任何新属性。您还可以根据需要使用Object.freeze()Object.seal(),这会更加限制对对象的修改。

但没有其他方法。

【讨论】:

    【解决方案2】:

    是的,我们可以,使用 Object.freeze。

    Object.freeze() 方法冻结一个对象:即阻止向它添加新属性;防止现有属性被删除;并防止更改现有属性或其可枚举性、可配置性或可写性。本质上,对象实际上是不可变的。该方法返回被冻结的对象。

    看到这个freeze reference

    检查这个sn-p

    var a = {a:1}
    var b={b:1}
    var c = Object.create(a)
    Object.getPrototypeOf(c) //a
    Object.freeze(c);
    c.__proto__ = b;//throws error now
    console.log(Object.getPrototypeOf(c)) //a
    var d = Object.create(null)
    Object.getPrototypeOf(d) //null
    d.__proto__ = b;
    Object.getPrototypeOf(d) //null

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 2019-07-09
      • 2019-07-09
      • 1970-01-01
      • 2018-04-25
      相关资源
      最近更新 更多