ImageVerifierCode 换一换
格式:DOC , 页数:8 ,大小:46KB ,
资源ID:9744420      下载积分:6 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9744420.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(JavaScript中的Reflect对象详解(ES6新特性).doc)为本站上传会员【人****来】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

JavaScript中的Reflect对象详解(ES6新特性).doc

1、   这篇文章主要介绍了JavaScript中的Reflect对象(ES6新特性)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下   Reflect介绍:   Reflect这个对象在我的node(v4.4.3)中还没有实现, babel(6.7.7)也没有实现 ,新版本的chrome是支持的, ff比较早就支持Proxy和Reflect了,要让node支持Reflect可以安装harmony-reflect ;   Reflect不是构造函数, 要使用的时候直接通过Reflect.method()调用, Reflect有的方法和Proxy差不多, 而且多数Refle

2、ct方法原生的Object已经重新实现了。   什么要使用Reflect   这里列举几个为什么要使用Reflect的原因, 译文地址:Reflect , 大概翻译了一遍:   1:更加有用的返回值: Reflect有一些方法和ES5中Object方法一样样的, 比如: Reflect.getOwnPropertyDescriptor和Reflect.defineProperty, 不过, Object.defineProperty(obj, name, desc)执行成功会返回obj, 以及其它原因导致的错误, Reflect.defineProperty只会返回false或者true

3、来表示对象的属性是否设置上了, 如下代码可以重构:   try {   Object.defineProperty(obj, name, desc);   // property defined successfully   } catch (e) {   // possible failure (and might accidentally catch the wrong exception)   }   重构成这样:   if (Reflect.defineProperty(obj, name, desc)) {   // success   } else {  

4、 // failure   }   其余的方法, 比如Relect.set , Reflect.deleteProperty, Reflect.preventExtensions, Reflect.setPrototypeOf, 都可以进行重构;   2:函数操作, 如果要判断一个obj有定义或者继承了属性name, 在ES5中这样判断:name in obj ;   或者删除一个属性 :delete obj[name], 虽然这些很好用, 很简短, 很明确, 但是要使用的时候也要封装成一个类;   有了Reflect, 它帮你封装好了, Reflect.has(obj, name)

5、 Reflect.deleteProperty(obj, name);   3:更加可靠的函数式执行方式: 在ES中, 要执行一个函数f,并给它传一组参数args, 还要绑定this的话, 要这么写:   f.apply(obj, args)   但是f的apply可能被重新定义成用户自己的apply了,所以还是这样写比较靠谱:   Function.prototype.apply.call(f, obj, args)   上面这段代码太长了, 而且不好懂, 有了Reflect, 我们可以更短更简洁明了:   Reflect.apply(f, obj, args)   4:

6、可变参数形式的构造函数: 想象一下, 你想通过不确定长度的参数实例化一个构造函数, 在ES5中, 我们可以使用扩展符号, 可以这么写:   var obj = new F(...args)   不过在ES5中, 不支持扩展符啊, 所以, 我们只能用F.apply,或者F.call的方式传不同的参数, 可惜F是一个构造函数, 这个就坑爹了, 不过有了Reflect,    我们在ES5中能够这么写:   var obj = Reflect.construct(F, args)   5:控制访问器或者读取器的this: 在ES5中, 想要读取一个元素的属性或者设置属性要这样:

7、   var name = ... // get property name as a string   obj[name] // generic property lookup   obj[name] = value // generic property   updateReflect.get和Reflect.set方法允许我们做同样的事情, 而且他增加了一个额外的参数reciver, 允许我们设置对象的setter和getter的上下this:   var name = ... // get property name as a string   Reflect.get(obj

8、 name, wrapper) // if obj[name] is an accessor, it gets run with `this === wrapper`   Reflect.set(obj, name, value, wrapper)访问器中不想使用自己的方法,而是想要重定向this到wrapper:   var obj = {   set foo(value) { return this.bar(); },   bar: function() {   alert(1);   }   };   var wrapper = {   bar : function(

9、) {   console.log("wrapper");   }   }   Reflect.set(obj, "foo", "value", wrapper);   6:避免直接访问 __proto__ :   ES5提供了 Object.getPrototypeOf(obj),去访问对象的原型, ES6提供也提供了   Reflect.getPrototypeOf(obj) 和 Reflect.setPrototypeOf(obj, newProto), 这个是新的方法去访问和设置对象的原型:   Reflect.apply的使用   Reflect.apply其实

10、就是ES5中的 Function.prototype.apply() 替身, 执行Reflect.apply需要三个参数   第一个参数为: 需要执行的函数;   第二个参数为: 需要执行函数的上下文this;   第三个参数为: 是一个数组或者伪数组, 会作为执行函数的参数;   <script>   let fn = function() {   this.attr = [0,1,2,3];   };   let obj = {};   Reflect.apply(fn, obj, [])   console.log(obj);    </

11、script>   Reflect.apply的DEMO:   <script>   Reflect.apply(Math.floor, undefined, [1.75]); // 输出:1;   Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]); // 输出:"hello"   Reflect.apply(RegExp.prototype.exec, /ab/, ["confabulation"]).index; //输出: 4   Reflect.apply(""

12、charAt, "ponies", [3]); // 输出:"i"   </script>Reflect可以与Proxy联合使用:   {   var Fn = function(){   };   Fn.prototype.run = function() {   console.log( "runs out" );   };   var ProxyFn = new Proxy(Fn, {   construct (target ,arugments) {   console.log("proxy constructor");   var obj = ne

13、w target(...arugments);   //Reflect.apply的使用方法;   Reflect.apply(target.prototype.run, obj, arugments);   return obj;   }   });   new ProxyFn (); //会先输出: "proxy constructor" ; 再输出: runs out   }Reflect.construct()的使用:   Reflect.construct其实就是实例化构造函数,通过传参形式的实现, 执行的方式不同, 效果其实一样, construct的第一个参数为构

14、造函数, 第二个参数由参数组成的数组或者伪数组, 基本的使用方法为:   var Fn = function(arg) {   this.args = [arg]   };   console.log( new Fn(1), Reflect.construct(Fn,[1]) ); // 输出是一样的   var d = Reflect.construct(Date, [1776, 6, 4]);   d instanceof Date; // true   d.getFullYear(); // 1776   //所以Reflect.consturct和new 构所以Refl

15、ect.consturct和new 构造函数是一样, 至少到目前为止..   我们可以给Reflect.construct传第三个参数 , 第三个参数为一个超类, 新元素会继承这个超类;   <script>   function someConstructor() {}   var result = Reflect.construct(Array, [], someConstructor);   Reflect.getPrototypeOf(result); // someConstructor.prototype   Array.isArray(result); /

16、/ true   //or   var Fn = function() {   this.attr = [1];   };   var Person = function() {   };   Person.prototype.run = function() {   };   console.log( Reflect.construct(Fn, [], Person) );   </script>   所以我们可以用这个实现一个特殊的的数组, 继承数组, 但是也有自己的方法;   var Fn = function() {   Array.apply(t

17、his, arguments);   this.shot = ()=> {   console.log("heheda");   };   };   var arr = Reflect.construct(Fn, [])Reflect.defineProperty的使用;   Reflect.defineProperty返回的是一个布尔值, 通过直接赋值的方式把属性和属性值添加给对象返回的是一整个对象, 如果添加失败会抛错;   var obj = {};   obj.x = 10;   console.log(obj.x) //输出:10;使用Reflect.de

18、fineProperty的方式添加值;   <script>   var obj = {};   if( Reflect.defineProperty(obj, "x", {value : 7 }) ) {   console.log("added success");   }else{   console.log("添加失败");   };   </script>如果我们执行preventExtensions, 通过Object.defindProperty定义新属性报错了, 但是通过Reflect.defineProperty没有报错, 返回了一个f

19、alse的值:   var obj = {};   Object.preventExtensions(obj);   Object.defineProperty(obj, "x" , {   value: 101,   writable: false,   enumerable: false,   configurable: false   });// 直接抛错了;   console.log( Reflect.defineProperty(obj, "x", {value:101}) ) //返回false:如果通过直接赋值的方式, 无论是否正确赋值, 都返回设置的值, 除

20、非我们手动确认对象的属性值是否设置成功;   <script>   var obj = {};   Object.preventExtensions(obj);   console.log( obj.aa = 1 ); //输出:1;   console.log(obj.aa) //输出:undefined;   </script>Reflect.deleteProperty的使用:   Reflect.deleteProperty和Reflect.defineProperty的使用方法差不多, Reflect.deleteProperty和 delete

21、 obj.xx的操作结果是一样, 区别是使用形式不同:一个是操作符,一个是函数调用;   Reflect.deleteProperty(Object.freeze({foo: 1}), "foo"); // false   delete Object.freeze({foo: 1}).foo; //输出:false;Reflect.get()方法的使用   这个方法的有两个必须的参数: 第一个为obj目标对象, 第二个为属性名对象, 第三个是可选的,是作为读取器的上下文(this);   var obj = {};   obj.foo = 1;   console.log( obj

22、foo ); //输出:1;   console.log( Reflect.get(obj, "foo") ) //输出:1;如果Reflect.get有第三个参数的话, 第三个参数会作为读取器的上下文:   var Reflect = require('harmony-reflect');   var obj = {   "foo" : 1,   get bar() {   return this.foo;   }   };   var foo = {};   foo.foo = "heheda";   console.log(Reflect.get(obj, "ba

23、r", foo));   Reflect.getOwnPropertyDescritptor()方法的使用:   通过Reflect.getOwnPropertyDescritptor获取属性描述:   Reflect.getOwnPropertyDescriptor({x: "hello"}, "x");   //也可以这样获取:   Object.getOwnPropertyDescriptor({x:"1"},"x");   //这两个的区别是一个会包装对象, 一个不会:   Reflect.getOwnPropertyDescriptor("hello",0); //抛出

24、异常   Object.getOwnPropertyDescriptor("hello",0); //输出: {value: "h", writable: false, enumerable: true, configurable: false}Reflect.getPrototypeOf()方法的使用:   Reflect.getPrototypeOf和Object.getPrototypeOf是一样的, 他们都是返回一个对象的原型   Reflect.getPrototypeOf({}); // 输出:Object.prototype   Reflect.getPrototypeO

25、f(Object.prototype); // 输出:null   Reflect.getPrototypeOf(Object.create(null)); // 输出: nullReflect.has的使用   Reflect.has这个方法有点像操作符:in , 比如这样: xx in obj;   <script>   Reflect.has({x:0}, "x") //输出: true;   Reflect.has({y:0}, "y") //输出:true   ; var obj = {x:0}; console.log( "x" in obj); var p

26、roxy = new Proxy(obj, { has : function(target, args) { console.log("执行has方法"); return Reflect.has(target,...args); } }); console.log( "x" in proxy); //输出:true; console.log(Reflect.has(proxy, "x")) //输出:true; </script>这个demo的obj相当于变成了一个方法了, 没他什么用 , 只是利用了他的has方法:   obj = new Proxy({}, {   has(

27、t, k) { return k.startsWith("door"); }   });   Reflect.has(obj, "doorbell"); // true   Reflect.has(obj, "dormitory"); // false   Reflect.isExtensible()的使用   // 现在这个元素是可以扩展的;   var empty = {};   Reflect.isExtensible(empty); // === true   // 使用preventExtensions方法, 让这个对象无法扩展新属性;   Reflect.prev

28、entExtensions(empty);   Reflect.isExtensible(empty); // === false   // 这个对象无法扩展新属性, 可写的属性依然可以改动   var sealed = Object.seal({});   Reflect.isExtensible(sealed); // === false   // 这个对象完全被冻结了   var frozen = Object.freeze({});   Reflect.isExtensible(frozen); // === falseReflect.isExtensible和Objec

29、t.isExtensible的区别是, 如果参数不对,一个会抛错, 另一个只是返回true或者false:   Reflect.isExtensible(1);   // 抛错了: 1 is not an object   Object.isExtensible(1);   // 返回false;Reflect.ownKeys()方法的使用:   Reflect.ownKeys, Object可没有ownKeys方法, Reflect.ownKeysz他的作用是返回对象的keys;   console.log(Reflect.ownKeys({"a":0,"b":1,"c":2,"

30、d":3})); //输出 :["a", "b", "c", "d"]   console.log(Reflect.ownKeys([])); // ["length"]   var sym = Symbol.for("comet");   var sym2 = Symbol.for("meteor");   var obj = {[sym]: 0, "str": 0, "773": 0, "0": 0,   [sym2]: 0, "-1": 0, "8": 0, "second str": 0};   Reflect.ownKeys(obj); //输出:/ [ "0", "8"

31、 "773", "str", "-1", "second str", Symbol(comet), Symbol(meteor) ]Reflect.ownKeys的排序是根据: 先显示数字, 数字根据大小排序,然后是 字符串根据插入的顺序排序, 最后是symbol类型的key也根据插入插入顺序排序;   出现这中排序是因为,你给一个对象属性赋值时候, 对象的key的排序规则就是先数字, 在字符串, 最后是symbol类型的数据;   Reflect.preventExtensions()的使用方法:   Object也有preventExtensions方法, 和Reflect.pre

32、ventExtensions()有一点区别, 如果Reflect.preventExtensions参数不是对象会抛错;   var empty = {};   Reflect.isExtensible(empty); // === true   // 执行preventExtensions后的对象可以修改;   Reflect.preventExtensions(empty);   Reflect.isExtensible(empty); // === false   Reflect.preventExtensions(1);   // TypeError: 1 is not

33、an object   Object.preventExtensions(1);   //不会抛错, 会返回:1Reflect.set()   Reflect.set方法和get是差不多的;   var obj = {};   Reflect.set(obj, "prop", "value"); // 输出:true   console.log( obj.prop ); // 输出:"value"   var arr = ["duck", "duck", "duck"];   Reflect.set(arr, 2, "goose"); // true   console.lo

34、g( arr[2] ); // "goose"   Reflect.set(arr, "length", 1); // true   console.log( arr );// ["duck"];Reflect.set(obj)相当于 Reflect.set(obj, undefined, undefined);   var obj = {};   Reflect.set(obj); // 输出:true   //以上的代码相当于 Reflect.set(obj, undefined, undefined);   Reflect.getOwnPropertyDescriptor(o

35、bj, "undefined");   // { value: undefined, writable: true, enumerable: true, configurable: true }Reflect.set也可以有第四个参数, 这个参数会作为stter的this;   var obj = {   value : 10,   set key( value ) {   console.log("setter");   this.value = value;   },   get key() {   return this.value;   }   };   Ref

36、lect.set(obj,"key","heheda", obj);   console.log(obj);Reflect.setPrototypeOf()   Reflect.setPrototypeOf()方法和Object.setPrototypeOf差不多一样样的, 会给对象设置原型, 就是更改对象的__proto__属性了…;   Reflect.setPrototypeOf({}, Object.prototype); // 输出true   // 给该对象数组[[Prototype]] 为null.   Reflect.setPrototypeOf({}, null);

37、 // true   // 此时的obj.__proto__为undefine   //把对象冻结以后重新设置[[prototype]]   Reflect.setPrototypeOf(Object.freeze({}), null); // false   // 如果原型链循环依赖的话就会返回false.   var target = {};   var proto = Object.create(target);   Reflect.setPrototypeOf(target, proto); // false   

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服