读取属性的特性
使用Object.getOwnPropertyDescriptor()方法可以去的指定属性的属性描述符。这个方法接收两个参数:属性所在的对象和要取得其描述符的属性名。返回值是一个对象,对于访问其属性包含configurable,enumerable,get和set属性,对于数据属性包含configurable,enumberable,writable和value属性。比如:`
let book = {};
object.definePeroperties(book,{
year_: {
value: 2017
},
edition: {
value: 1
},
year: {
get: funtion() {
return this.year_;
},
set:function(newValue){
if (newValue > 2017) {
this.year_ = newValue;
this.edition += newValue - 2017;
}
}
}
});
let descriptor = Object.getOwnPropertyDescriptor(book, "year_");
console.log(descriptor.value); // 2017
console.log(descriptor.configurable); // false
console.log(typeof descriptor.get); // "undefined"
let descriptor = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor.Value); // undefined
console.log(descriptor.enumerable); // false
console.log(typeof descriptor.get); // "function"
对于数据属性year_,value等于原来的值,configurable是false,get是undefined。对于访问器属性year,value是undefined,enuemerable是false,get是一个指向获取函数的指针。
ECMAScrapt2017新增了Object,getOwnPropertyDescriptors()静态方法。这个方法实际上在每个自有属性上调用Object。defineProperties()并在一个新对象中返回它们。对于前面的例子,使用这个静态方法会返回如下对象:
let book = {};
Object.defineProperties(book, {
year_: {
value: 2017
},
edition: {
value: 1
},
year: {
get: function() {
return this.year_;
},
set: function(newValue){
if (newValue > 2017) {
this.year_ = newValue;
this.edition += newValue - 2017;
}
}
}
});
console.log(Object.getOwnPropertyDescriptors(book));
// (
// configurable: false,
// enumerable: false,
// value: 1,
// writable: false
// ),
// year: (
// configurable: false,
// enumerable: false,
// get: f(),
// set: f(newValue),
// ),
// year_: (
// configurable: false,
// enumerable: false,
// value: 2019,
// writable: false
// )
// )