[英]How do I make a specific property of an object immutable in javascript?
如果我有一個像
let person = {
firstName: 'Krishna',
lastName: 'Jai',
age: 12
}
person.firstName = 'Kumar';
console.log(person);
//output
Object { firstname: 'Kumar', lastName: 'Jai', age: 12 }
但是我不應該讓任何用戶更改人的名字。 如何使firstName不可變,以便其值不能被覆蓋?
如果已經有一個屬性 ,則可以將其描述符的writable
屬性修改為false
,如下所示:
Object.defineProperty(person, 'firstName', {
writable: false,
configurable: false
});
configurable: false
應指定configurable: false
以防止將來對firstName
屬性進行修改,例如將writable
回true
。
在此處閱讀更多有關屬性描述符的信息。
如果要定義以前不存在的屬性,則所有描述符屬性都默認為false
,而您需要指定的唯一value
是value
和enumerable
:
Object.defineProperty(person, "firstName", {
value: "Krishna",
enumerable: true
});
您有兩種選擇,但可能最簡單的方法是設置一個只讀的,不可配置的屬性:
let person = {
lastName: 'Jai',
age: 12
};
Object.defineProperty(person, "firstName", {
value: "Krishna",
enumerable: true
});
如上所述,當您定義新屬性時, writable
和writable
configurable
標志均默認為false
。 (您不必讓它枚舉,至於那去,但是......)
例:
let person = { lastName: 'Jai', age: 12 }; Object.defineProperty(person, "firstName", { value: "Krishna", enumerable: true }); console.log("before: ", person.firstName); person.firstName = "Mohinder"; console.log("after setting in loose mode:", person.firstName); function foo() { "use strict"; console.log("trying to set in strict mode:"); person.firstName = "Mohinder"; // Error } foo();
或者,如果您想在事后應用更改,則需要指定標志:
let person = {
firstName: "Krishna",
lastName: 'Jai',
age: 12
};
Object.defineProperty(person, "firstName", {
writable: false,
configurable: false
});
例:
let person = { firstName: "Krishna", lastName: 'Jai', age: 12 }; Object.defineProperty(person, "firstName", { writable: false, configurable: false }); console.log("before: ", person.firstName); person.firstName = "Mohinder"; console.log("after setting in loose mode:", person.firstName); function foo() { "use strict"; console.log("trying to set in strict mode:"); person.firstName = "Mohinder"; // Error } foo();
您可以使用getter方法並省略setter。
let person = { get firstName() { return 'Krishna'; }, lastName: 'Jai', age: 12 }; person.firstName = 'Kumar'; console.log(person);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.