簡體   English   中英

如何使對象的特定屬性在javascript中不可變?

[英]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屬性進行修改,例如將writabletrue

在此處閱讀更多有關屬性描述符的信息。

如果要定義以前不存在的屬性,則所有描述符屬性都默認為false ,而您需要指定的唯一valuevalueenumerable

Object.defineProperty(person, "firstName", {
    value: "Krishna",
    enumerable: true
});

您有兩種選擇,但可能最簡單的方法是設置一個只讀的,不可配置的屬性:

let person = {
    lastName: 'Jai',
    age: 12
};
Object.defineProperty(person, "firstName", {
    value: "Krishna",
    enumerable: true
});

如上所述,當您定義新屬性時, writablewritable 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM