【问题标题】:Is it possible to prevent modifying the particular key's value of an object? [duplicate]是否可以防止修改对象的特定键值? [复制]
【发布时间】:2019-02-10 03:34:48
【问题描述】:

我想防止编辑对象的特定键值。意味着它应该只初始化一次。 假设有一个构造函数 Student(fname,lname,id)。

function Student(fname,lname,id){
     this.fname = fname;
     this.lanme= lname;
     this.id= id;
}

var st1 = new Student ('surya','pratap',1)

我想防止修改Id 只对st1.fname 和lname 可以修改。

【问题讨论】:

  • 这听起来像X/Y Problem。这个要求的目的是什么?
  • @Phil 我认为如何使用只读属性的问题是一个非常合理的问题。
  • @csum 我没说不是。我所追求的是对预期用途的一些澄清。例如,OP 可能认为这是一种防止篡改存储在 API 后面的记录的方法,但如果 Student 对象被序列化为 JSON,它实际上不会阻止恶意用户
  • @Phil 我支持 csum。如果问题要求一些奇怪的东西,例如“如何在没有 ls 的情况下列出 bash 中的文件”,我会要求澄清,但这是一个非常合理的问题。
  • 仅供参考,我并不是要结束这个问题或暗示这不是一个好问题。我只是想知道为什么 OP 想要将该字段设为只读

标签: javascript


【解决方案1】:

有几种方法可以实现这一点,目前最简单的方法如下:

function Student(fname,lname,id){
     this.fname = fname;
     this.lanme= lname;
     this.id=id;
     Object.defineProperty(this, "id", {
      writable: false,
      value: id,
      configurable: false
    });
}

【讨论】:

  • 那里不再需要this.id=id;。它将被Object.defineProperty覆盖。
【解决方案2】:

在 es6 中,您可以使用 Symbols 来做到这一点:

const 
  ID = Symbol(),
  NAME = Symbol()
;

export default class Student {

  constructor(id, name) {
    this[ID] = id;
    this[NAME] = name;
  }

  get id () { return this[ID]; }

  get name () { return this[NAME]; }
}

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2018-09-30
    • 2020-03-26
    • 2015-10-04
    • 2016-11-28
    • 2019-11-18
    相关资源
    最近更新 更多