检测属性方法与Object方法

属性检测方法:

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类型的属性都会被拷贝。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值