javascript - 在 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);
解决方案
在您的第二行中,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);
推荐阅读
- c - C scanf 请求的格式
- powershell - 如何将数组参数传递给函数
- sql-server - 创建表查询中的 T-SQL 日期格式
- php - 我无法使用 ajax 在数据库中注册为成员 php 以进行注册活动
- python - PyQt5 Designer 不使用 Ananconda 3 加载自定义小部件
- tizen - Tizen Wearable 4.0 - S Health 计步器
- arduino - 为什么 const_cast from and to a const char * 会导致 strcmp != 0
- javascript - 谷歌地图 JavaScript API 问题
- android - 实现自定义 GridView
- java - 将层从 cartoDB 浏览器添加到 Android 应用程序