枚举性
在前面的课程中,我们知道可以对象添加属性,并且可以使用for...in语句来枚举这些属性。如:
var student = {name:"David", age:18}
for (var key in student)
{
console.log("key=" +key+", value="+student[key])
}
上述代码会有如下输出:
key=name, value=David
key=age, value=18
我们看到for...in可以遍历student对象的属性key。实际上for...in能遍历的属性叫做可枚举属性(enumerable property)。
通过 object.property=value
方式、以及{name:value}
创建的属性均是可枚举属性。
如果你希望创建一个不可枚举属性,该怎么做呢?通过Object.defineProperty方法就可以实现。
Object.defineProperty(obj, prop, descriptor)
Object.defineProperty用添加或修改一个对象的属性。参数obj是要被修改的对象,prop是属性名,descriptor是对这个新加或修改属性的描述 。
通过一个例子来看一下descriptor的用法:
var student = {}
Object.defineProperty(student, "name", {
value:"David",
enumerable:false
}) // 为student添加name属性,值为"David",但不可枚举
for (var key in student){
console.log("key=" +key+", value="+student[key])
} // 尝试用for...in来遍历对象
console.log(student.name) // 输出对象name属性
上述代码中,通过Object.defineProperty方法为student添加了一个不可枚举的name属性。然后依次使用for...in、student.name来引用。让我们看一下运行结果:
David
可以看到for...in并未遍历出name属性,但student.name确实是存在的。这是由于enumerable被设置为false的原因。
只读性
我们知道可以使用const关键字定义常量,那一个对象的属性可以设置为常量吗?答案是可以,这也要通过Object.definePorperty函数来完成。下面的例子说明了如何设置一个只读属性:
var student = {}
Object.defineProperty(student, "name", {
value:"David",
writable:false
}) // 注意writable被设置为了false
console.log(student.name) // 修改前输出name属性
student.name = "James" // 尝试修改name属性
console.log(student.name) // 修改后输出name
上面用defineProperty添加了name属性,将writable设置为了false。然后后续代码尝试输出name属性。来看一下运行结果:
David
David
可以看到,无论修改前还是修改后都输出了David,显然student.name="James"
这一行代码并未成功修改name。
可配置性
可配置性(configurable)主要用于属性是否删除。将一个属性设置为不可配置,则该属性无法被删除。我们通过下面代码来理解一下:
var student = {}
Object.defineProperty(student, "name", {
value:"David",
configurable:false,
})
console.log(student.name)
delete student.name // 尝试删除name属性
console.log(student.name)
上述程序的运行结果是:
David
David
可以看到,name并未成功删除。
总结
enumerable、writable、configurable 是一个属性的三大基础特性。
通过obj.property = value
及{property:value}
方法添加或修改的属性其enumerable=true、writable=true、configurable=true。
而通过Object.defineProperty定义的属性,其enumerable、writable、configurable默认都为false,除非显式指定。
好了,这一节就到这里。Object.definePorperty是JavaScript中的高级内容,一般来说只框架编写者才会使用到。希望你掌握了。
Object还有其它哪些高频方法?
请继续关注我的课程,我将在后续课程中帮大家依次解答上述问题。
想学计算机技术吗?需要1对1专业级导师指导吗?想要团队陪你一起进步吗?欢迎加我为好友!