属性检测方法:
1.in
格式:属性名 in 对象
作用:对象的自有属性或继承属性中包含这个属性则返回true。
栗子:
var o = {x: 1};
"x" in o; //返回true,因为"x"是o的属性
"y" in o; //返回false,因为"y"不是o的属性
"toString" in o;//返回true,因为o继承了toString属性
2.!==
格式:属性名 !== undefined
作用:判断属性是否为undefined
栗子:
var o = {x:1};
o.x !== undefined;//返回true,因为o中有属性x且值为1,而不是undefined
o.y !== undefined;//返回false,因为o中没有属性y
o.toString !== undefined;//返回true,o继承了toString属性
3.hasOwnProperty()
格式:对象.hasOwnProperty(属性名)
作用:检测给定的属性是否是对象的自有属性。如果是返回true,否
则返回false。
注意:继承属性返回false。
栗子:
var o = {x:1};
o.hasOwnProperty('x');//返回true,因为x是o的自有属性。
o.hasOwnProperty('y');//返回false,因为y不是o的自有属性。
o.hasOwnProperty('toString');//返回false,因为toString是o的继承属性,而不是自有属性。
4.propertyIsEnumerable()
格式:对象.propertyIsEnumerable(属性名)
作用:检测给定的属性是否为对象的自有属性且该属性是否为可枚举属性(enumerable为true), 如果是返回true,否则返回false
5.isPrototypeOf()
格式:对象1.isPrototypeOf(对象2)
作用:检测对象1是否是对象2的原型。如果是返回true,否则返回false
object方法:
1.Object.getOwnPropertyDescriptor()
格式:Object.getOwnPropertyDescriptor(对象,属性名)
作用:获得指定对象中指定属性的属性描述符。
栗子:
Object.getOwnPropertyDescriptor({x:1},'x');
//返回{value:1,writable:true,enumerable:true,configurable:true}
//对于继承和不存在的属性,返回undefined
Object.getOwnPropertyDescriptor({},'x');//undefined,没有这个属性
Object.getOenPropertyDescriptor({},'toString');//undefined,继承属性
2.属性描述符
分类:
*数据描述符:是一个具有值的属性,该值可能是可写的,也可能不是可写的。
*存取描述符:是由getter、setter函数对描述的属性。
*注意:描述符必须是这个两种形式之一,不能同时是两者。
描述特性:
共有:
*configurable:表示对象的属性是否可以被删除,以及除value和writable特
性外的其他特性能否被修改。默认为false。
*enumerable:定义了对象的属性是否可以在for-in循环和Object.keys()中被
枚举。默认为false。
数据描述符特有:
*value:该属性对应的值。可以是任何有效的JavaScript值(数值,对象,函数等)。
默认为undefined。
*writable:当且仅当该属性的writable为true时,value才能被赋 值运算符改变。
默认为false。
存取描述符特有:
*get:一个给属性提供getter的方法,如果没有getter则为undefined。当访问该属性时,
该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,
这里this并不一定是定义该属性的对象)。默认为undefined。
*set:一个给属性提供setter的方法,如果没有setter则为undefined当属性值修改时,
触发执行该方法。该方法将接受唯一参数,即 该属性新的参数值。默认为undefined。
*注意:*如果一个描述符不具有value,writable,get,set任意一个关键字,那么他将
被认为是一个数据描述符。
*如果一个描述符同时拥有(value或writable)和(get或set)关键字,将会产生异常。
3.Object.defineProperty()
格式:Object.defineProperty(对象,属性名,{属性描述符对象})
作用:定义一个新属性或修改一个现有属性,并返回这个对象。
栗子:
var o = {};//创建一个空对象
//添加一个不可枚举的数据属性x,并赋值为1
Object.defineProperty(o,'x',{
value:1, //设置属性值为1
writable:true,//设置属性是否可写,true表示可写
enumerable:false,//设置属性是否可枚举,false表示不可枚举
configurable:true//设置属性的特性是否可配置,true表示可配置,注意当为false时
})
//属性是存在的,但不可枚举
o.x;//1
Object.keys(0);//[]
//现在对属性x做修改,让它变为只读
Object.defineProperty(o,'x',{writable:false});
//试图更改这个属性
o.x = 2;//操作失败但不报错,在严格模式中抛出类型错误异常
//属性值依然是可配置的,因此可以通过这种方式对它进行修改
Object.definedProperty(o,'x',{value:2});
o.x;//2
//现在将x从数据属性修改为存取器属性
Object.definedProperty(o,'x',{get:function (){return 0;}});
o.x;//0
扩展:
若要同时修改或创建多个属性,需要使用Object.definedProperties()
第一个参数是要修改的对象,第二个参数是一个映射表,包含要新建或修
改的属性的名称,以及他们的属性描述符。
栗子:
var p = Object.defineProperties({},{
x:{value:1,writable:true,enumerable:true,configurable:true},
y:{value:1,writable:true,enumerable:true,configurable:true},
r:{
get:function (){return Math.sqrt(this.x*this.x+this.y*this.y)},
enumerable:true,
configurable:true
}
});
4.Object.create()
格式:Object.create(对象)
作用:创建一个对象,并使用传入的对象作为该对象的原型。注意:传入null时,表示创建了一个空白对象,空白对象中没有内置的Object方法。
5.Object.getPrototypeOf()
格式:Object.getPrototypeOf(对象)
作用:查询传入对象的原型。
6.Object.keys()
格式:Object.keys(对象)
作用:返回一个由给定对象自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for-in循环遍历该对象时返回的顺序一致。如果对象的键-值都不可枚举,那么将返回
由键组成的数组。
7.Object.assign()
格式:Object.assign(目标对象,源对象1,…源对象n)
作用:用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
注意:
*如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似的覆盖前面的源对象的属性。
*Object.assign方法只会拷贝源对象自身的并且可枚举的属性到目标对象。
*String类型和Symbol类型的属性都会被拷贝。