精华内容
下载资源
问答
  • Reflect

    2021-01-20 21:49:00
    Reflect 对象和 Proxy 对象一样,是对对象的操作,但是 Reflect 有以下几点优势。 修改了 Object 方法的返回结果。Object 对象的一些操作返回错误时,而Reflect 返回 false。 让 Object 的操作变成函数。 Reflect ...

    Reflect 对象和 Proxy 对象一样,是对对象的操作,但是 Reflect 有以下几点优势。

    1. 修改了 Object 方法的返回结果。Object 对象的一些操作返回错误时,而Reflect 返回 false。
    2. 让 Object 的操作变成函数。
    3. Reflect 对象的方法和 Proxy 对象的方法一一对应。

    这一章可以对照的 Proxy 的内容一起看。Proxy


    Reflect.get(target,name,receiver)

    查找并返回 target 对象的 name 属性,如果没有找到该属性,则返回undefined。

    Reflect.set(target,name,value,receiver)

    设置 target 对象的 name 属性等于 value 。

    Reflect.has(obj,name)

    对应 name in obj 中的 in 运算符。

    Reflect.deleteProperty(obj,name)

    用于删除对象的属性,相当于 delete obj[name] 。

    Reflect.construct(target,args)

    等同于调用了 new target(…args),提供了一种不适用 new 来调用构造函数的方法。

    Reflect.getPrototypeOf(obj)

    读取对象的 __proto__ 属性,对应 Object.getPrototypeOf(obj)。

    Reflect.setPrototypeOf(obj,newProto)

    设置对象的 __proto__ 属性,返回第一个参数对象,对应 Object.setPrototypeOf(obj,newProto)。

    Reflect.apply(func,thisArg,args)

    等同于Function.prototype.apply.call(func,thisArg,args),用于绑定 this 对象后执行给定的函数。

    Reflect.defineProperty(target,propertyKey,attributes)

    等同于 Object.defineProperty(),用来为对象定义属性。

    Reflect.getOwnPropertyDescriptor(target,propertyKey)

    等同于 Object.getOwnPropertyDescriptor,用于获得指定属性的描述对象。

    Reflect.isExtensible(target)

    对应 Object.isExtensible,返回一个布尔值,表示当前对象是否可以扩展。

    Reflect.preventExtensions(target)

    对应 Object.preventExtensions,用于使一个对象变为不可扩展的,返回一个布尔值,表示是否操作成功。

    Reflect.ownKeys(target)

    等同于 Object.getOwnPropertyNames 和 Object.getOwnPropertySymbols 之和,用于返回对象的所有属性。

    展开全文
  • reflect

    2004-08-29 14:19:00
    2004-2-29 星期日(Sunday) 晴可以利用reflect取出类的信息,并可以执行类的方法使用类的属性,也可以为类添加方法和属性,也可以再classloader对字节码类进行处理。
    2004-2-29 星期日(Sunday) 晴

    可以利用reflect取出类的信息,并可以执行类的方法使用类的属性,也可以为类添加方法和属性,也可以再classloader对字节码类进行处理。
    展开全文
  • ES6个人笔记记录——Reflect1

    万次阅读 2020-05-08 16:14:53
    概述 Reflect对象和Proxy对象一样,也是ES6为了操作对象而提供的API ...现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只在Reflect对象上部署,也就是说:从Reflect对象上可以...

    概述

    Reflect对象和Proxy对象一样,也是ES6为了操作对象而提供的API

    Reflect对象的设计目的有以下几个:

    1.将Object对象的一些明显属于语言内部的方法		(比如:Object.defineProperty)放到Reflect对象上。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只在Reflect对象上部署,也就是说:从Reflect对象上可以	获得语言内部的方法
    
    2.修改某些Object方法的返回结果,让其变得更合理。(比如:Object.defineProperty(obj,name,desc)在无法定义属性时会抛出一个错误,而Reflect.defineProperty(obj,name,desc)则会返回false)
    
    3.让Object操作都变成函数行为。某些Object操作是命令式。(比如name in obj和delete obj[name],而Reflect.has(obj,name)和Reflect.deleteProperty(obj,name)让他们变成了函数行为)
    	
    4.Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法, 、就能在Reflect对象上找到对应的方法。这就使Proxy对象可以方便地调用对应的Reflect方法来完成默认行为,作为修改行为的基础。也就是说,无论Proxy怎么修改默认行为,我们总可以在Reflect上获取默认行为
    

    1和2条的例子

    // 旧写法
    try{
    	Object.defineProperty(target,property,attributes);
    		// success
    } catch(e){
    		// failure
    }
    
    
    // 新写法
    if(Reflect.defineProperty(target,property,attributes)){
    	// success
    }else{
    	// failure
    }
    

    3条的例子

    // 旧写法
    console.log('assign' in Object);
    
    // 新写法
    console.log(Reflect.has(Object,'assign'));
    

    4条的例子

    const { 
    	set ,
    	get ,
    	deleteProperty ,
    	has
    } = Reflect;
    
    Proxy(target,{
    	set : function(target,name,value,receiver){
    		let success = set(target,name,value,receiver);
    		if(success){
    			log('property ' + name + ' on ' + target + ' set to ' + value);
    		}
    		return success;
    	}
    })
    

    代码中,Proxy方法拦截target对象的属性赋值行为。

    它采用Reflect.set方法将值赋给对象的属性,确保完成原有的行为,然后再部署额外的功能

    let loggedObj = new Proxy(obj,{
    	get(target,name){
    		console.log('get',target,name);
    		return get(target,name);
    	},
    	deleteProperty(target,name){
    		console.log('delete',name);
    		return deleteProperty(target,name);
    	},
    	has(target,name){
    		console.log('has',name);
    		return has(target,name);
    	}
    })
    

    上面的代码中,m每一个Proxy对象的拦截操作(get,delete,has)内部都调用对应的Reflect方法,保证原生行为能正常运行,添加的工作就是将每一个操作输出一个日志

    有了Reflect对象,很多操作更易读

    // 旧写法
    console.log(Function.prototype.apply.call(Math.floor,undefined,[1,75]));
    
    // 新写法
    console.log(Reflect.apply(Math.floor,undefined,[1,75]));
    
    展开全文
  • ES6个人笔记记录——Reflect2

    万次阅读 2020-05-08 17:41:38
    1.Reflect.get() Reflact.get 方法查找并返回target对象的name属性, 如果没有该属性,则返回undefined const { get , set , defineProperty , deleteProperty , construct , getPrototypeOf , } = ...

    1.Reflect.get()

    Reflact.get 方法查找并返回target对象的name属性,
    如果没有该属性,则返回undefined
    
    const { 
    	get , 
    	set , 
    	defineProperty ,
    	deleteProperty ,
    	construct ,
    	getPrototypeOf ,
    
    } = Reflect;
    
    let myObject1 = {
    	foo : 1,
    	bar : 2,
    	get baz(){
    		return this.foo + this.bar;
    	}
    };
    
    console.log(get(myObject1, 'foo'),
    	get(myObject1, 'bar'),
    	get(myObject1, 'baz'));
    
    let myReceiverObject = {
    	foo : 4,
    	bar : 4,
    };
    

    如果name属性部署了读取函数(getter),则读取函数的this绑定receiver

    如果第一个参数不是对象就会报错

    console.log(get(myObject1,'baz',myReceiverObject));
    

    2.Reflect.set(target,name,value,receiver)

    用Reflect.set方法设置target对象的name属性等于value

    let myObject2 = {
    	foo : 1,
    	set bar(value){
    		return this.foo = value;
    	}
    }
    
    console.log(myObject2.foo);
    set(myObject2,'foo',2);
    console.log(myObject2.foo);
    set(myObject2,'bar',10);
    console.log(myObject2.foo);
    

    如果name属性设置了赋值函数,则赋值函数的this绑定receiver

    let myReceiverObject1 = {
    	foo : 0,
    };
    
    set(myObject2,'bar',1,myReceiverObject1);
    console.log(myObject2.foo,myReceiverObject1.foo);
    

    如果第一个参数不是参数,Reflect.set()会报错

    注意:Reflect.set会触发Proxy.defineProperty

    let p = {
    	a : 'a'
    };
    
    let handler = {
    	set(target,key,value,receiver){
    		console.log('set');
    		set(target,key,value,receiver);
    	},
    	defineProperty(target,key,attribute){
    		console.log('defineProperty');
    		defineProperty(target,key,attribute);
    	}
    };
    
    let obj = new Proxy(p,handler);
    obj.a = 'A';
    

    3.Reflect.deleteProperty(obj,name)

    Reflect.deleteProperty方法等同于delete obj[name],用于删除对象的属性。

    const myObj = { foo : 'bar' };
    
    // 旧写法
    console.log(delete myObj.foo);
    
    // 新写法
    console.log(deleteProperty(myObj,'foo'));
    
     该方法返回一个布尔值。
     如果删除成功或者被删除的属性不存在,就返回true;
     如果删除失败或者被删除的属性依然存在,就返回false
    

    4.Reflect.construct(target,args)

    Reflect.construct方法等同于new target(...args),
    提供了一种不使用new来调用构造函数的方法
    
    function Greeting(name){
    	this.name = name;
    }
    
    // new的写法
    const instance = new Greeting("wjy");
    
    // Reflect.construct的写法
    const instanceNew = construct(Greeting,["hj"]);
    

    5.Reflect.getPrototypeOf(obj)

    用于读取对象的__proto__属性,对应Object.getPrototypeOf(obj)

    const myObj3 = new FancyThing();
    
    // 旧写法
    Object.getPrototypeOf(myObj3) === FancyThing.prototype;
    
    // 新写法
    getPrototypeOf(myObj3) === FancyThing.prototype;
    
    // 区别:
    // 如果参数不是对象,Object.getPrototypeOf会将这个参数转为对象,然后再运行
    // 而Reflect.getPrototypeOf会报错
    
    // eg
    Object.getPrototypeOf(1)	//Number{[[PrimitiveValue]] : 0}
    Reflect.getPrototypeOf(1)	//报错
    

    6.Reflect.setPrototypeOf(obj,newProto)

    Reflect.setPrototypeOf方法用于设置对象的__proto__属性,返回第一个参数对象,对应Object.setPrototypeOf(obj,newProto)

    7. Reflect.apply(func,thisArg,args)

    Reflect.apply方法等同于Function.prototype.apply.call(func,thisArg,args)

    用于绑定this对象后执行给定函数

    一般来说,如果要绑定一个函数的this对象,可以写成fn.apply(obj,args)的形式,但是如果函数定义了自己的apply方法,那么就只能写成Function.prototype.apply.call(fn,obj,args)的形式,采用Reflect对象可以简化这种操作.
    
    const args = [11,33,12,54,18,96];
    
    // 旧写法
    const youngest = Math.min.apply(Math,args);
    const oldest = Math.max.apply(Math,args);
    const type = Object.prototype.toString.call(youngest);
    
    // 新写法
    const youngest_1 = Reflect.apply(Math.min,Math,args);
    const oldest_1 = Reflect.apply(Math.max,Math,args);
    const type_1 = Reflect.apply(Object.prototype.toString,youngest,[]);
    

    8.Reflect.defineProperty(target,propertyKey,attributes)

    方法基本等同于Object.defineProperty,用来定义对象属性

    /*
    	function MyDate(){
    		//
    	}
    	
    // 旧写法
    Object.defineProperty(MyDate,'now',{
    	value : () => Date.now();
    });
    
    // 新写法
    Reflect.defineProperty(MyDate,'now',{
    	value : () => Date.now();
    });
    
    	如果Reflect.defineProperty的第一个参数不是对象,就会抛出错误.
    	比如Reflect.defineProperty(1,'foo')
     */
    

    9.Reflect.getOwnPropetyDescriptor(target,propertyKey)

    用于获得指定属性的描述对象

    10.Reflect.isExtensible(target)

    表示当前对象是否可拓展

    11.Reflect.perventExtensions(target)

    用于使一个对象变为不可扩展,返回一个布尔值,表示操作是否成功

    12.Reflect.ownKey(target)

    用于返回对象的所有属性,基本等同于:Object.getOwnPropertynames()和Object.getOwnPropertySymbols之和

    // eg
    let myObj4 = {
    	foo : 1,
    	bar : 2,
    	[Symbol.for('baz')] : 3,
    	[Symbol.for('bing')] : 4,
    };
    
    // 旧写法
    console.log(Object.getOwnPropertySymbols(myObj4),
    	Object.getOwnPropertyNames(myObj4));
    
    // 新写法
    console.log(Reflect.ownKeys(myObj4));
    
    展开全文
  • Reflect对象

    2020-06-26 13:34:03
    Reflect对象Reflect设计目的常用方法Reflect.apply()Reflect.construct()Reflect.define​Property()Reflect.delete​Property()Reflect.get()Reflect.get​OwnProperty​Descriptor()Reflect.get​PrototypeOf()...
  • xbean-reflect-3.4.jar
  • 详解Reflect

    2020-10-24 09:16:45
    Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与proxy handlers的方法相同。Reflect不是一个函数对象,因此它是不可构造的。 Reflect对象的设计的目的: 1. 将Object对象的一些明显属于...
  • Reflect反射

    2020-07-05 20:46:49
    Reflect对象是ES6为操作对象而提供的新 API 设计目的: 1.将Object对象的一些内部方法放到Reflect对象上 2.修改一些Object方法的返回结果,使其更合理 3.让Object的操作都变为函数行为 4.Reflect对象的方法与Proxy...
  • ES6 Reflect

    2020-02-13 20:01:13
    1.reflect 概述 Reflect 对象与Proxy对象一样,也是ES6为了操作对象而提供的新的Api。Reflect对象的设计目的有以下几个。 1.1将Object对象上的一些明显属于语言内部的方法(类如Object.defineProperty)放到...
  • Reflect介绍

    2018-12-10 04:48:01
    Reflect 是一个内置的对象,它提供可拦截JavaScript操作的方法。方法与代理处理程序的方法相同。Reflect 不是一个函数对象,因此它是不可构造的。 new Reflect() //错误的写法 Reflect使用Reflect提供了一些静态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,108
精华内容 28,843
关键字:

reflect