gpt4 book ai didi

javascript - javascript 对象是否可以具有常量值?

转载 作者:行者123 更新时间:2023-12-04 08:28:15 25 4
gpt4 key购买 nike

我是 javascript 的初学者,我尝试坚持良好的编程实践,例如对不变的值使用常量。
例如,我想将设置存储在一个常量中:

const settings = {};
settings.backgroundColor = '#FFF';
settings.textColor = '#333';
settings.shadowColor = '#DDD';
我注意到即使“设置”是一个常量,我可以稍后在程序执行期间重新分配其他值,例如我可以在此处重新分配值而不会触发错误:
settings.backgroundColor= '#FFF';
if ( test === 1) {
// my block of code
}
settings.backgroundColor= '#F00';
settings.backgroundColor= '#00F';
settings.backgroundColor= '#123';
此代码有效并且控制台不会抛出任何类型的错误。
是否有解决方案将真实常量存储在我的对象“常量设置”中?
我试过这个,但没有用:
const settings = {};
const settings.backgroundColor = '#123';
const settings.textColor = '#333';
const settings.shadowColor = '#DDD';
它抛出一个错误“未捕获的语法错误:标识符‘设置’已经被声明”
这个问题不是很重要,因为我的代码可以正常工作,我只是尝试进行良好的开发实践。
感谢您的帮助 !

最佳答案

这可以通过将对象传递给 Object#freeze 来实现。方法。
来自 MDN docs :

The Object.freeze() method freezes an object. A frozen object can nolonger be changed; freezing an object prevents new properties frombeing added to it, existing properties from being removed, preventschanging the enumerability, configurability, or writability ofexisting properties, and prevents the values of existing propertiesfrom being changed. In addition, freezing an object also prevents itsprototype from being changed. freeze() returns the same object thatwas passed in.



const settings = {};
settings.backgroundColor = '#FFF';
settings.textColor = '#333';
settings.shadowColor = '#DDD';

Object.freeze(settings)

settings.textColor = "#FFF";
console.log(settings)

settings.newColor = "#FFF";
console.log(settings)

delete settings.textColor
console.log(settings)

注意 - 上述操作抛出 TypeError在严格模式下
上述方法对对象进行了浅层卡住,但可以修改任何子对象属性:

const obj1 = {
internal: {}
};

Object.freeze(obj1);
obj1.internal.a = 'aValue';

console.log(obj1.internal.a)

要卡住整个对象图,您需要递归地卡住对象的各个对象属性:

function deepFreeze(object) {
// Retrieve the property names defined on object
const propNames = Object.getOwnPropertyNames(object);
// Freeze properties before freezing self
propNames.forEach(name => {
const value = object[name];

if (value && typeof value === "object") {
deepFreeze(value);
}
});
return Object.freeze(object);
}

const obj2 = {
internal: {
a: null
}
};

deepFreeze(obj2);

obj2.internal.a = 'anotherValue';
console.log(obj2.internal.a)

关于javascript - javascript 对象是否可以具有常量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65157316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com