属性描述对象
【数据属性】
-
[[value]]
:默认为 undefined -
[[writable]]
:是否可写,默认为true -
[[enumerable]]
:是否可枚举(会在循环中被列出),默认为true如果为false,则以下方法获取不到:
for...in
Object.keys()
JSON.stringify()
Object.assign()
-
[[configurable]]
:是否可修改,默认为true-
一个属性被定义为不可配置之后,就不能再变回可配置的了
-
可修改意味着:
-
是否可以通过 delete 删除并重新定义
-
是否可以修改它的特性
-
是否可以把它改为访问器属性
-
-
【访问器属性】
-
有
getter
和setter
函数,就不能有[[value]]
和[[writable]]
-
[[Get]]
:获取函数,在读取属性时调用 -
[[Set]]
:设置函数,在写入属性时调用
let book = {
year_: 2017,
edition: 1
};
Object.defineProperty(book, "year", {
get() {
return this.year_;
},
set(newValue) {
if (newValue > 2017) {
this.year_ = newValue;
this.edition += newValue - 2017;
}
}
});
book.year = 2018;
console.log(book.edition); // 2
let user = {
name: "John",
surname: "Smith",
get fullName() {
return `${this.name} ${this.surname}`;
},
set fullName(value) {
[this.name, this.surname] = value.split(" ");
}
};
user.fullName = "kobe bryant"
console.log(user.fullName);
方法
【获取属性描述对象】
-
Object.getOwnPropertyDescriptor(obj, propertyName)
:获取属性描述对象 -
Object.getOwnPropertyDescriptors(obj)
:获取所有属性的描述对象(最全)用于克隆
Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj));
【设置属性描述对象】
-
Object.defineProperty(obj, propertyName, descriptor)
:设置单个属性的属性描述对象,默认都为false
let person = {}; Object.defineProperty(person, "name", { writable: false, value: "Nicholas" }); console.log(person.name); // "Nicholas" person.name = "Greg"; console.log(person.name); // "Nicholas"
-
Object.defineProperties(obj, descriptors)
:设置多个let book = {}; Object.defineProperties(book, { year_: { value: 2017 }, edition: { value: 1 }, year: { get() { return this.year_; }, set(newValue) { if (newValue > 2017) { this.year_ = newValue; this.edition += newValue - 2017; } } } });