Reflect对象和Object对象的区别

2,622 阅读5分钟

概念区别

  • Reflect:是javaScript的内置对象,它不是一个函数对象,不可构造,即不可以和new一起用,所提供的方法都是静态方法;
  • Object:是JavaScript的内置对象,它是个构造函数,以new Object()的形式被调用,所提供的方法有静态方法(构造函数方法)和原型方法;

方法区别(第一种)

Reflect.defineProperty(target,property,description)

    参数解释:

        target:目标对象

        property:属性名称

        description:属性值的描述
    
    返回值:布尔值
    
    示例:
    
        const a ;
        let b = Reflect.defineProperty(a,'name',{
            value:'jack'
        })
        a.name;   //jack
        console.log(b);   //true;

Object.defineProperty(target,property,description)

        参数解释:

        target:目标对象

        property:属性名称

        description:属性值的描述
    
    返回值:返回这个对象target
    
    示例:
    
        const a ;
        let b = Object.defineProperty(a,'name',{
            value:'jack'
        })
        a.name;   //jack
        console.log(b);   //{name:'jack'}

总结:区别于返回值的不同,Reflect成功失败都会返回布尔值,相对于Object来说更加明确结果

方法区别(第二种)

Reflect.getOwnPropertyDescriptor(target,property)

    参数解释:

        target:目标对象

        property:属性名称

    
    返回值:如果属性存在在对象上,则返回描述符,否则返回undefined
    
    示例:
    
        let b = Reflect.getOwnPropertyDescriptor({x:'jack'},'x')
        console.log(b);  //{value:'jack',configurable:ture,wirtable:true,enumerable:true}

Object.getOwnPropertyDescriptor(target,property)

        参数解释:

        target:目标对象

        property:属性名称

    
    返回值:如果属性存在在对象上,则返回描述符,否则返回undefined
    
    示例1:
    
        let b = Object.getOwnPropertyDescriptor({x:'Mary'},'x')
        console.log(b);   //{value:'Mary',configurable:ture,wirtable:true,enumerable:true}
    示例2:
    
        //foo本身不是个对象
        let b = Object.getOwnPropertyDescriptor('foo',0)
        console.log(b);   //{value:'f',configurable:false,wirtable:false,enumerable:false}

总结:区别于第一个参数,如果第一个参数不是一个对象(即原始值),Object会将这个参数转化成对象,而Reflect会成TypeError报错

方法区别(第三种)

Reflect.getPrototypeOf(target)

    参数解释:

        target:目标对象

    
    返回值:返回指定对象的原型,如果没有继承的属性,则返回null
    
    示例:
    
        let b = Reflect.getPrototypeOf({})
        console.log(b); //Object.prototype

Object.getPrototypeOf(target)

        参数解释:

        target:目标对象

    
    返回值:返回指定对象的原型,如果没有继承的属性,则返回null
    
    示例1:
    
        let b = Object.getPrototypeOf({})
        console.log(b);   //Object.prototype
    示例2:
    
        let b = Object.getPrototypeOf('foo')
        console.log(b);   //String.prototype

总结:区别于第一个参数,如果第一个参数不是一个对象(即原始值),Object会将这个参数转化成对象,而Reflect会成TypeError报错

方法区别(第四种)

Reflect.isExtensible(target)

    参数解释:

        target:目标对象(默认情况下对象都是可以被拓展的,即是否可以在它上面添加新的属性)

    
    返回值:返回一个布尔值说明对象是否可以拓展
    
    示例1:
        
        const a = {};
        let b = Reflect.isExtensible(a)
        console.log(b); //true;
     示例2:
        
        let b = Reflect.isExtensible(1)  //参数不是对象的情况下
        console.log(b); //false;

Object.isExtensible(target)

        参数解释:

        target:目标对象(默认情况下对象都是可以被拓展的,即是否可以在它上面添加新的属性)

    
    返回值:返回一个布尔值说明对象是否可以拓展
    
    示例1:
    
        const a = {};
        let b = Object.isExtensible(a)
        console.log(b);   //true
    示例2:
    
        let b = Object.isExtensible(1)
        //false

总结:基本无差别,提醒,只是Object.isExtension在es6中,参数(非对象)的返回由报错变成false。

方法区别(第五种)

Reflect.preventExtensions(target)

    参数解释:

        target:目标对象(禁止对象添加新的属性)

    
    返回值:返回一个布尔值说明对象是否成功被设置为不可拓展
    
    示例1:
        
        const a = {};
        let b = Reflect.preventExtensions(a)
        console.log(b); //true;
     示例2:
        
        let b = Reflect.preventExtensions(1)  //参数不是对象的情况下
        console.log(b); //TypeError

Object.preventExtensions(target)

        参数解释:

        target:目标对象(禁止对象添加新的属性)

    
    返回值:返回不可以拓展对象
    
    示例1:
    
        const a = {name:'jack'};
        let b = Object.preventExtensions(a)
        console.log(b);   //{name:'jack'}
        //检查下是否可拓展
        let c = Object.isExtensible(b);
        console.log(c);   //false
    示例2:
    
        let b = Object.preventExtensions(1)
        //1

总结:返回值不同,Reflect返回布尔值,告诉我们结果的成功或失败,而Object返回这个对象,无法得知是否成功或者失败。

方法区别(第六种)

Reflect.setPrototypeOf(target,prototype)

    参数解释:

        target:目标对象
        prototype:对象的新原型(对象或者null)

    
    返回值:返回一个布尔值说明对象设置原型对象是否成功
    
    示例1:
        
        const a = {};
        let b = Reflect.setPrototypeOf(a,null)
        console.log(b); //true;
     示例2:
        
        let b = Reflect.setPrototypeOf(1,1)  //参数不是对象或者prototype不是对象/null的情况下
        console.log(b); //TypeError

Object.setPrototypeOf(target,prototype)

        参数解释:

        target:目标对象
        prototype:对象的新原型(对象或者null)

    
    返回值:返回目标对象
    
    示例1:
    
        const a = {name:'jack'};
        let b = Object.setPrototypeOf(a,null)
        console.log(b);   //{name:'jack'}

总结:返回值不同,Reflect返回布尔值,告诉我们结果的成功或失败,而Object返回这个对象,无法得知是否成功或者失败,需要注意的是,如果该目标对象被设置了不可拓展,那么是无法在这个对象上指定原型对象的。

全部总结

Reflect对象中与Object对象相同的方法中,就以上六种方法存在的类似和区别,Reflect对象上还有另外七种,Object对象上的静态方法和原型方法还有很多,不在这里一一列表,我们就拿着这两个对象上相同的方法来做对比

  • Object对象的方法中,大多返回目标对象,对于开发编程中我们很难确认这种结果的返回是否说明方法的成功或者失败,而在Reflect对象中,返回布尔值,明确告诉我们结果的成功或失败。
  • Object对象的方法中,第一个参数如果不是对象(原始值)的时候,Object将参数转为对象,而在Reflect对象中,直接报TypeError的错误。
  • 可见,es6中,Reflect方法更加严谨,使用更加明确。