属性描述对象:
(1)Object.getOwnPropertyDescriptor()
var obj={ p:'a' };
console.log(Object.getOwnPropertyDescriptor(obj,'p'));
返回为:
{ value: 'a',
writable: true,
enumerable: true,
configurable: true }
[Finished in 0.2s]
Object.getOwnPropertyDescriptor()
中有两个参数分别代表目标对象和以及一个字符串它对应目标对象的某个属性名。最后返回属性描述对象,比如说以上代码返回的有可读属性writable
以及遍历属性enumberable
,还有可修改属性configurable
,以及他们对应的默认值都为true
。
但是该方法只能用于自身的属性,而不能用于继承的属性,
var obj={ p:'a' };
console.log(Object.getOwnPropertyDescriptor(obj,'String'));
返回值为
undefined
[Finished in 0.3s]
(2)Object.defineProperty()&Object.defineProperties()
var obj=Object.defineProperty({},'p',{
value:1,
writable:true,
enumerable:true,
configurable:false
});
obj.p=2;
console.log(obj.p);
输出为:
2
[Finished in 0.2s]
Object.fefineProperty()
里面有三个参数,分别是第一个,属性所在的对象,第二个,属性名,第三个,描述对象的属性。利用这三个参数来重新定义对象。
上述对象的writable
属性为true
,所以重新写入对象object.p
的值为2,并且输出为2.
var obj=Object.defineProperty({},'p',{
value:1,
writable:false,
enumerable:true,
configurable:false
});
obj.p=2;
console.log(obj.p);
输出为:
1
[Finished in 0.2s]
我们可以看到上面的代码显示我们的writable
属性改变为false
,这时再写入2时,最后输出仍旧是1。
描述对象的属性的默认值:
var obj=Object.defineProperty({},'p',{
});
console.log(Object.getOwnPropertyDescriptor(obj, 'p'));
输出为:
{ value: undefined,
writable: false,
enumerable: false,
configurable: false }
从以上我们可以看出Object.fefineProperty()
的默认值。
(3)Object.prototype.propertyIsEnumerable()
实例对象的propertyIsEnumerable()
方法返回一个布尔值,用来判断某个属性是否可遍历。注意,这个方法只能用于判断对象自身的属性,对于继承的属性一律返回false
。
var obj = {};
obj.p = 123;
obj.propertyIsEnumerable('p') // true
obj.propertyIsEnumerable('toString') // false
上面代码中,obj.p
是可遍历的,而obj.toString
是继承的属性。
元属性
以上描述属性中用到的value
,writable
,enumberable
,configurable
都叫元属性,又叫做属性的属性,他们对属性起了控制作用。
其中value
控制了属性的值,而writable
则是用来描述value
的值是否可以被写入。
var proto=Object.defineProperty({},'foo',{
value:'a',
writable:false
});
var obj=Object.create(proto);
obj.foo='b';
console.log(obj.foo);
//输出为:a
[Finished in 0.4s]
因为上面的writable
属性为不可写入
所以后面继承proto
对象的obj
不能对其value
改变,如果想改变的话要重新描述属性并让value
重新赋值为另外的值。
enumberable
属性是看该对象是否可以遍历,准确来说,如果它的值为false
的话,那么该对象不能进行如下操作:
(1)for...in
操作(它可以遍历到继承的属性)
(2)Object.keys()
方法(它不能遍历到继承的属性)
(3)JSON.stringfy()
方法(它可以排除掉那些enumberable
被设为false
的属性)
他也有它的独特用法,可以使一些对象不被遍历。
var obj={};
Object.defineProperty(obj,'x',{
value:123,
enumberable:false
});
console.log(obj.x);
for ( value in obj){
console.log(obj.x);
}
console.log(Object.keys(obj));
console.log(JSON.stringify(obj));
/*输出为:
123
[]
{}
以上代码想我们验证了上面的理论。
configurable
元属性是可配置属性,当这个元属性设置为false
时,这个属性的value
,writable
,enumberable
都不能改变。但是,value
属性