首页 > 解决方案 > 在 JavaScript 中更改元数据是如何工作的?

问题描述

在控制台中,abc尽管设置了{writable:false}. 您能解释一下更改元数据的工作原理吗?

let portfolio = {
  myFirstName: "Bob",
  myLastName: "Alice",
  myAge: 26,
  aboutMe: function() {
    return ("First Name: " + this.myFirstName + "; Last Name: " + this.myLastName + "; Age: " + this.myAge + ";");
  }
};
Object.defineProperty(portfolio, "myFirstName", { writable: false });
Object.defineProperty(portfolio, "myFirstName", { value: "abc" });
console.log(portfolio.myFirstName);

标签: javascript

解决方案


在您的第二行中,Object.defineProperty(portfolio, "myFirstName", { value: "abc" });您再次定义了该属性。

您没有分配值。您正在扔掉旧房产并用全新的品牌取而代之。(技术上不正确,它通过很多步骤来评估和应用属性属性的值,但为了简单理解,我相信这足以理解,因为在这种情况下感觉像是一个新的。如果你愿意,请阅读链接拥有复杂的真相)

要分配一个新的值portfolio.myFirstName = "value here",你会看到它被写保护。

let portfolio = {
  myFirstName: "Bob",
  myLastName: "Alice",
  myAge: 26,
  aboutMe: function() {
    return ("First Name: " + this.myFirstName + "; Last Name: " + this.myLastName + "; Age: " + this.myAge + ";");
  }
};
Object.defineProperty(portfolio, "myFirstName", { writable: false });
portfolio.myFirstName = "Alice";
console.log(portfolio.myFirstName);

为防止出现这种变通方法,请Object.freeze()在修改其属性后调用该对象。这也会产生其他副作用,例如无法编辑其他属性的值。

let portfolio = {
  myFirstName: "Bob",
  myLastName: "Alice",
  myAge: 26,
  aboutMe: function() {
    return ("First Name: " + this.myFirstName + "; Last Name: " + this.myLastName + "; Age: " + this.myAge + ";");
  }
};
Object.defineProperty(portfolio, "myFirstName", { writable: false });
Object.freeze(portfolio);
Object.defineProperty(portfolio, "myFirstName", {value:"abc"});
console.log(portfolio.myFirstName);


推荐阅读