属性的特性:
writable: true // 可写 是否可设置该属性的值
enumerable: true // 可枚举 for/in是否可以获得该值
configurable: true // 是否可以删除属性或修改该属性的特性
// 在node中即使是false也会被删除
自定义属性的特性:
Object.defineProperty(对象, 属性名, 特性描述对象)
Object.defineProperties(对象, 多属性特性描述对象)
查看属性的特性:
Object.getOwnPropertyDescriptor(对象, 属性名) -> 私有属性的特性描述
小技巧:
好用的set get
自定义属性的特性
Object.defineProperty(对象, 属性名, 特性描述对象)
writable:false
var obj = {
x: 1,
y:2
}
Object.defineProperty(obj, "z", {
value: 3, // 值
writable: false, // 不可写
enumerable: true, // 可枚举
configurable: true, // 可删除和再次配置
})
obj.z = 4; // 写入失败
console.log(obj)
![v2-b02a27bdf61a8b73b3f2ed2877e88328_b.png](https://i-blog.csdnimg.cn/blog_migrate/3d4895536d50b08efe1456c06532ef7b.png)
enumerable: false
在浏览器中打印obj可以显示,只是在for/in循环中不可枚举
在node中打印obj不可以显示
var obj = {
x: 1,
y:2
}
Object.defineProperty(obj, "z", {
value: 3,
writable: true,
enumerable: false, // 不可枚举
configurable: true,
})
console.log(obj)
for(var i in obj) {
console.log(i+" : "+obj[i])
}
![v2-cb1ad39937f86d6f77ab795ae74fc2c6_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/e24ef5556fc15c73403603d6a5d9b66c.png)
![v2-b190001f5c551404352fbd246b0f3b5d_b.png](https://i-blog.csdnimg.cn/blog_migrate/c733b4807190e86ff79c25cd99225aca.png)
configurable: false
- 在浏览器中delete obj.z 会返回false,不被删除。在node中会被删除
var obj = {
x: 1,
y:2
}
Object.defineProperty(obj, "z", {
value: 3,
writable: true,
enumerable: true,
configurable: false,
})
![v2-aabeb1640e7816f3ff896697ad3917de_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/0b33036fa0650d23c12bd460af9a05bd.png)
![v2-08fdebd489fab307966de389ffcb9fe7_b.png](https://i-blog.csdnimg.cn/blog_migrate/c1c581a74deb8d19493db0343656b894.png)
2. 不可重新写属性的特性配置,不然会报错。如果是true则不报错
var obj = {
x: 1,
y:2
}
Object.defineProperty(obj, "z", {
value: 3,
writable: true,
enumerable: true,
configurable: false, // 可删除和再次配置
})
Object.defineProperty(obj, "z", {
value: "z特性重新被配置",
writable: false,
enumerable: true,
configurable: true,
})
console.log(obj)
![v2-ab0206e1756f541232c2f89861211879_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/8f5bce668dbce43dc1f3b8227ac0cf84.jpeg)
报错。
改成configurable: true
var obj = {
x: 1,
y:2
}
Object.defineProperty(obj, "z", {
value: 3, // 值
writable: true, // 不可写
enumerable: true, // 可枚举
configurable: true, // 可删除和再次配置
})
Object.defineProperty(obj, "z", {
value: "z特性重新被配置", // 值
writable: false, // 不可写
enumerable: true, // 不可枚举
configurable: true, // 不可删除 在node中不可行
})
console.log(obj)
![v2-87486af4bba5149acb8ba1932fef6830_b.png](https://i-blog.csdnimg.cn/blog_migrate/6c7f9e2a7f115adeb6f9e05c36698144.png)
重新配置成功
Object.defineProperties(对象, 多属性特性描述对象)
var obj = {
x: 1,
y:2
}
Object.defineProperties(obj, {
z: {
value: 3,
writable: true,
enumerable: true,
configurable: true,
},
t: {
value: 4,
writable: true,
enumerable: true,
configurable: true,
},
w: {
value: 5,
writable: true,
enumerable: true,
configurable: true,
},
})
console.log(obj)
![v2-7ba00b705cd08936e9f8bcae115720f3_b.png](https://i-blog.csdnimg.cn/blog_migrate/f5b5a046deb1e965cd8dc2d395e20bfb.png)
查看属性的特性:
Object.getOwnPropertyDescriptor(对象, 属性名)
var obj = {
x: 1,
y:2
}
Object.defineProperty(obj, "z", {
value: 3,
writable: true,
enumerable: true,
configurable: true,
})
Object.defineProperty(obj, "z", {
value: "z特性重新被配置",
writable: false,
enumerable: true,
configurable: true,
})
console.log(Object.getOwnPropertyDescriptor(obj, 'z'))
![v2-a51336e8de79679e0d0cb59857c6fa5a_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/f50d1b581e3bc74facafe183b7ee241e.png)
小技巧的使用:
假设一个班上有男生10人,女生8人,每人班费10元,班上的人数不会变,但是费用会变动。
对象中的函数
let class0 = {
boy: 10,
girl: 8,
allmoney: 10 * 10 + 10 *8,
// 如果想要得到一个这样的对象
}
// 对象中的函数
let class1 = {
boy: 10,
girl: 8,
allmoney: 0
}
Object.defineProperty(class1, "onemoeny", {
set: function(money) {
this.allmoney = money * (this.boy + this.girl);
},
get: function() {
return "总共: " + this.allmoney;
},
})
![v2-b9273ffb25399ca458c147158fa37336_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/98ff35dbcdd9ab3a3c14ddd94c0bbba0.png)
只要修改了自定义属性中的onemoeny价格,再次查看对象,对象中的allmoney就会改变。
![v2-c94b8290092de6ee54f432913f22ea14_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/135fcf4cbfae0ab5d3cc0df0388dc09f.jpeg)
get是函数返回出来的结果。
注意的点:
自定义的属性不能在再配置set/get函数中出现,不然会死循环报错
let class1 = {
boy: 10,
girl: 8,
allmoney: 0
}
Object.defineProperty(class1, "onemoeny", {
set: function(money) {
this.onemoeny = 10; // 试试出现在set中不该出现的onemoney属性 重新调用该函数
this.allmoney = money * (this.boy + this.girl);
},
get: function() {
return "总共: " + this.allmoney;
},
})
![v2-c1d6d3009efe6380996e69f36c06af50_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/3e5bbaeeaf7b524b0f93945b95af99a0.jpeg)
最大次数超过堆栈的最大值
模拟死循环
let class1 = {
boy: 10,
girl: 8,
allmoney: 0,
num: 0,
}
Object.defineProperty(class1, "onemoeny", {
set: function(money) {
console.log("set num: " + this.num++)
this.onemoeny = 10; // 重新调用该函数
this.allmoney = money * (this.boy + this.girl);
},
get: function() {
return "总共: " + this.allmoney;
},
})
![v2-0bebbc7953f56e089a2d7d126ef56025_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/7b87a098e918aab63e0d444d1f8ed798.jpeg)