js系列三十一:属性类型
作者:互联网
在上面的继承实现中,使用了一个大家可能不太熟悉的方法;defineProperties,并且在定义getGrade时使用了一个很奇怪的方式。
getGrade:{
value: function() {
return this.grade;
}
}
这个其实是对象中的属性类型,通常给对象添加一个属性时,直接使用 Object.param的方式就可以了,或者直接在对象中挂载。
var person = {
name: 'Ken'
}
在ECMAScript5中,对每一个属性都添加了几个属性类型,用来描述这些属性的特性,具体如下:
- 1 configurable:表示该属性是否被delete删除,当其值为false时,其他特性也不能被改变,默认值为 true。
- 2 enumerable:是否枚举,即是能否被 for-in 遍历。默认值为 true。
- 3 writable: 是否修改值,默认值为 true。
- 4 value: 该属性的具体值是多少,默认值为undefined。
- 5 get: 当通过person.name访问name的值时,get将被调用。该方法可以自定义返回的具体值是多少,get的默认值为undefined。
- 6 set: 当通过person.name = ‘ken’的时候,set方法将被调用。该方法可以自定义设置具体方式,set的默认值为undefined。
需要注意的是,不能同时设置value,writable与get,set的值。
可以通过Object.defineProperty方法修改这些属性类型。
下面就通过几个简单的例子来演示这些属性类型的具体表现
configurable
// 用普通的方式给 person 对象添加一个 name 属性,值为Ken
var person = {
name: "Ken"
}
//使用delete删除该属性
delete person.name; //返回true,表示删除成功
// 通过Object.defineProperty重新添加name属性
Object.defineProperty(person, 'name', {
configurable: false,
value: 'Ken'
})
// 再次删除
delete person.name // false
console.log(person.name);
// 试图改变value
person.name = 'aa'
console.log(person.name) // Ken 改变失败
enumerable
var person = {
name: 'KEN',
age: 20
}
// 使用for-in循环枚举Person的值
var param = [];
for(var key in person) {
params.push(key);
}
// 查看枚举结果
console.log(params);
// 重新设置name属性的类型,让其不可被枚举
Object.defineProperty(person, 'name', {
enumerable: false
})
var params_ = [];
for(var key in person){
params_.push(key);
}
// 再次查看
console.log(params_);
writable
var person = {
name: 'Ken'
}
// 修改name的值
person.name = "Jake";
// 查看修改的结果
console.log(person.name) // jake
//设置name属性不能被修改
Object.defineProperty(person, 'name', {
writable: false
})
// 再次视图修改name的值
person.name = 'alex'
console.log(person.name); //修改失败
value
var person = {}
// 添加一个name属性
Object.defineProperty(person, 'name', {
value: "Ken"
})
console.log(person.name) // ken
get/set
var person = {};
// 通过get与set自定义访问,设置name属性
Object.defineProperty(person, 'name', {
get: function() {
return "Ken"
},
set: function(value) {
console.log(value + 'in set');
}
});
// 第一次访问 name ,调用get
console.log(person.name)
// 尝试修改name值,此时set方法被调用
person.name = "alex";
// 第一次访问 name,还是调用get
console.log(person.name) // ken
注意:请尽量同时设置 get 和 set。如果,只设置了 get,那么将无法设置该属性,如果只设置 set 那么将无法获取值
Object.defineProperty只能设置一个属性的属性特性,当想要同时设置多个属性的特性时,需要使用之前介绍过的 Object.defineProperties属性
var person = {}
Object.defineProperties(person, {
name: {
value: "Jake",
configurable: true
},
age: {
get: function() {
return this.value || 22
},
set: function(value) {
this.value = value
}
},
})
person.name //Jake
person.age // 22
读取属性的特性值
可以利用Object.getOwnPropertyDescriptor方法读取某一个属性值
var person = {}
Object.defineProperty(person, 'name', {
value: 'alex',
writable: false,
configure: false
})
var descripter = Object.getOwnPropertyDescriptor(person, 'name');
console.log(descripter)
descripter = {
configurable: false,
enumerable: false,
value: 'alex',
writable: false
}
标签:name,Object,三十一,value,js,person,var,属性 来源: https://blog.csdn.net/qq_36772866/article/details/89006973