Javascript Proxy对象 简介

by admin on 2019年2月2日

Javascript Proxy对象 简介

Javascript Proxy对象

改变你操作对象的点子

必发365乐趣网投手机版 1

Proxies 是Javasript对象的中间件

…或者说至少是那种很早的本子。

ES6
中引入Proxies,让您可以自定义Object的基本操作。例如,get就是Object的底子操作方法。

const obj = {
   val: 10
};

console.log(obj.val);

这里,console.log()表达式在对象obj上执行get办法来取得val的值。

另一个目的的基本操作方法是 set

const obj = {
   val: 10
};

obj.val2 = 20;

这里,set格局用来给目的obj设置一个新的值。


关于小编

杰夫•萨瑟兰(Jeff
Sutherland),Scrum发明者与共同创建人,被誉为“Scrum之父”,《敏捷宣言》起草人之一。

萨瑟兰结束学业于西点军校,曾作为美利坚联邦合众国海军战斗机飞行员,达成过100次飞越南社会主义共和国部越南社会主义共和国的应战义务。1972年,萨瑟兰得到巴黎高等传媒学院总括学博士学位。1980年,他取得威斯康星大学的浮游生物计算学博士学位。1983年,萨瑟兰进入中洲电脑服务集团,该商厦为150家银行提供技术劳务,他负责研发ATM互联网技术。萨瑟兰还先后担任了11家软件商店的主任和首席技术官,积累了增加的连串管理经验。二〇〇六年,他创制了友好的营业所Scrum,Inc.,提供Scrum管理章程的培训服务。

怎么创制Proxy?

const proxiedObject = new Proxy(initialObj, handler);

调用Proxy构造函数,new Proxy()将重临一个目的,不仅富含了initialObj必发365乐趣网投手机版,里的值,而且其基本操作(如get
set)现在得以经过handler对象来指定一些自定义逻辑。

我们写个例证来了然那个定义,

const handler = {
    get: function() {
        console.log('A value has been accessed');
    }
}

const initialObj = {
    id: 1,
    name: 'Foo Bar'
}

const proxiedObj = new Proxy(initialObj, handler);

console.log(proxiedObj.name);

目前,即便我们从未社团一个Proxy对象,执行第14行的console.log(proxiedObj.name)会在控制台出口
“Foo Bar”。

可是现在大家定义了一个Proxy,并在第三行get办法中定义了一部分自定义逻辑。

明天实施console.log(proxiedObj.name)会在控制台出口 “A value has been
accessed”。

必发365乐趣网投手机版 2

精心看,你会发觉控制麦德林其实有两条记下。 “A value has been accessed”
undefined。 为什么?🤔

get运算符的默许落成是回去Object中蕴藏的值。由于我们将它重写为只记录一条语句,该值永远不会回来,由此第14行的console.log()输出undefined

让大家来缓解这一个题材!

get运算符有三个参数 – 对象自我和被访问的习性。

const handler = {
    get: function(obj, prop) {
        console.log('A value has been accessed');
        return obj[prop]; // 返回访问的key在obj的值
    }
}

const initialObj = {
    id: 1,
    name: 'Foo Bar'
}

const proxiedObj = new Proxy(initialObj, handler);

console.log(proxiedObj.name);

回去属性值

必发365乐趣网投手机版 3

回到属性值 — 控制台的输出

好多了呢! 😄

我们为get提供的自定义覆盖被誉为“拦截器”(大约基于操作系统拦截的概念)。
handler对象基本上是一个饱含一组“拦截”的靶子,每当访问对象属性时都会被触发。

我们给set也添加一个“拦截器”。 大家将做一样的事情 –
任几时候设置一个值,大家将记录被改动的属性,以及为该键设置的值。

set操作符有多少个参数 – 对象自我,被访问的属性和为该属性设置的值。

const handler = {
    get: function(obj, prop) {
        console.log('A value has been accessed');
        return obj[prop];
    },
    set: function(obj, prop, value) {
        console.log(`${prop} is being set to ${value}`);
    }
}

const initialObj = {
    id: 1,
    name: 'Foo Bar'
}

const proxiedObj = new Proxy(initialObj, handler);

proxiedObj.age = 24

添加`set` “拦截器”

此地,在第18行开展的造访将触及第6行定义的效率,该意义将记录正在访问的质量和正在安装的值。

必发365乐趣网投手机版 4

`Set` “拦截器” —— 控制台的出口


野史故事

在越南社会主义共和国战争时期(1955年—1975年),对于美利坚合众国战机飞行员而言,要进行100次飞行任务,飞到敌国领空被击落的票房价值是50%。

1967年,萨瑟兰依然一个未曾经验的后生飞行员,当时却是做最惊险的一项工作:侦查。他的战机只装备了相机与备用燃料箱,飞到越南社会主义共和国空间让领航员拍摄轰炸义务前后的肖像。萨瑟兰在进行职责的时,肾上腺素就会飙升,但他根本都能冷静应对,面对诸如此类惊险程度总是很淡定。他将这一素质归功于在空军服役时期学到的高危机管控能力。在陶冶中学会了着眼、导向、决定和行动四件事。具体地讲,先观望对象区域,然后确认进入和剥离目标区域的拔尖途径,在未知事件面前及时地做出调整,最终在本能的驱动下行使断然的行动。犹豫不决会要了一个飞行员的命,但贸然行事也会要了一个飞行员的命。一旦领航员拍好照片,我就会用力拉操纵杆,提高飞行中度,远离危险区域。

越南社会主义共和国战争停止后,萨瑟兰回到了米利坚,到西弗吉尼亚香槟分校高校念书计算学硕士学位。结束学业后,萨瑟兰到了美利哥海军高校教学数学、计算学和几率论。后来,又到亚拉巴马大学医高校学习生物统计学大学生学位。用几年时光时间找出促使一个健康细胞爆发癌变的元素。萨瑟兰学到了好多关于系统论的知识,了然了为何一个细胞初叶衍变时,会从一个安静境况过渡到另一个安宁情状。他花了临近10年的时间商量什么推进一个错综复杂的自适应系统从一个状态过渡到另一个状态,以及如何有限支撑下一个情景是主动的,而非悲伤的。

几年之后,萨瑟兰发现集体、团队和人都足以被视为复杂的自适应系统,使细胞从一个状态过渡到另一个情景的要素,同样可以令人从一个场所过渡到另一个动静。要改变细胞,首先须要把能量注入系统中,开始可能会产出紊乱局面,看起来一塌糊涂,一切都地处运动中。当您准备改变一个团协会时,可能也会时有发生如此的工作,这一个集体的成员变得匆忙不安,因为她们无法了然暴发了何等,也不了解自己应有怎样应对。不过,就如细胞一样,协会会以神速的快慢进入平稳的新图景。唯一的难点在于,新情形是或不是优于于旧状态,细胞是变成癌细胞依旧正常细胞。当时本人想驾驭我们是还是不是可以找出有些简易的条条框框,以此指点团队变得更急迅、更愉悦、更具备相互帮忙精神、更有童趣以及愈发令人向往。

在里根政坛期间,科学切磋经费遭到大幅减小,中洲统计机服务公司找到了萨瑟兰。因为该店铺听说他是技巧世界内的主流专家,一个耳熟能详系统论的人。该铺面最新、最热点的成品是所谓的“自动柜员机互连网”(ATMnetwork/ATM取款机)。要明白,那是在1983年的时候。

当萨瑟兰进入中洲电脑服务公司后,发现该商厦的电脑编程部门利用的是“瀑布法”。该机构有着数百名总括机程序员,天天辛苦,但不可能在指定的岁月按预算提交成果。该公司的工本比收入多出了30%。高层总管时常发生出吼叫,须求她们升高细化管理,提议尖锐的渴求,命令他们越来越努力地劳作,命令他们加班等。但不论是老总如何施加压力,项目依然延期超支。

因为现在社团运行格局难题重重,已经力不从心通过小修小补的点子来校对了。萨瑟兰决定在小卖部里面另起炉灶组建新部门.萨瑟兰找到程序员们和CEO们,告诉她们:“大家率先要甘休做那么些把大家折腾死的事务。大家亟须找出更好的行事方法,而且必须马上付诸实践。”

他把那些新机构分成多少个团体来管理,奖金的发给不是看个人业绩,而是看一切机关的业绩。当时采纳的一部分工具在10年之后逐渐演化成了Scrum的元素,其中囊括产品负责人(product
owner)、Scrum主管(Scrummaster)、产品待办事项清单(product
backlog)以及周周冲刺(weekly
sprint)。三个月后,那个集体成了百分之百公司最盈利的部门,营业收入当先支出的30%。开发的Nonstop
Tandem系统是最早拿到银行看重并被使用的在线交易系统,应用到了全方位北美地区。

再后来,2001年十月11日到13日,17位软件开发领域的领军官物聚集在弥利坚犹他州的滑雪胜地雪鸟(Snowbird)雪场。经过二日的议论,“敏捷”(Agile)那个词为全部聚会者所承受,用以概括一套全新的软件开发价值观。诞生了最出名的“敏捷软件开发宣言”。

一个诚实的例子

借使我们有一个定义叫person的目的

const person = {
   id: 1,
   name: 'Foo Bar'
};

假使大家想让那一个目的的id属性是一个私房属性呢?
没人能够通过person.id访问那个特性,借使有人这么做,大家要求抛出一个荒唐。
我们将什么成功那或多或少?

让Proxies来拯救吧!‍

俺们所急需做的就是给这几个目的创制一个Proxy,并掩盖get运算符来阻止大家访问id属性!

const handler = {
    get: function(obj, prop) {
        if (prop === 'id') { // Check if the id is being accessed
            throw new Error('Cannot access private properties!'); // Throw an error
        } else {
            return obj[prop]; // If it's not the id property, return it as usual
        }
    }
}

const person = {
    id: 1,
    name: 'Foo Bar'
}

const proxiedPerson = new Proxy(person, handler);

console.log(proxiedPerson.id);

阻挡访问私有属性

此地,在我们给get创造的“拦截器”,大家检查被访问的性质是不是是id特性,假诺是的话,大家会抛出一个荒谬。
否则,大家照常重回值。

必发365乐趣网投手机版 5

村办属性 — 控制台出口


另一个极好的用例是校验。
通过安装set“拦截器”,大家得以在设置值在此以前添加自定义表达。
假若该值不切合验证,大家得以抛出一个荒谬!

const handler = {
    set: function(obj, prop, value) {
        if (typeof value !== 'string') {
            throw new Error('Only string values can be stored in this object!');
        } else {
            obj[prop] = value;
        }
    }
}

const obj = {};

const proxiedObj = new Proxy(obj, handler);

console.log(proxiedObj); // This will log an empty object
proxiedObj.name = 'Foo Bar'; // This should be allowed
console.log(proxiedObj); // This will log an object with the name property set

proxiedObj.age = 24; // This will throw an error.

自定义对象的属性校验

必发365乐趣网投手机版 6

自定义校验 – 控制台出口


在地方的事例中,我们已经阅览了getset“陷阱”。
实际上可以安装更加多的“陷阱”。
你可以在此间找到凡事列表

Proxy对象只是在阅读有关它们的那篇小说之后才进去自家的视野,我早已足以在自身每日写的代码中看出它们的用处了!

如果您前边在档次或办事中运用过Proxies,我很愿意听到!

~最后~


若是您认为那篇小说对你有用,请点个赞!

在如何地点卡住了,须要越来越多的扶助,仍然只想打个招呼?
Hashnode
给我向来发难点,或者在Twitter上Call我。
你也得以在Github上找到自己。

本文转发自:众成翻译
译者:eJayYoung
链接:http://www.zcfy.cc/article/4755
原文:https://blog.campvanilla.com/advanced-guide-javascript-proxy-objects-introduction-301c0fce9432

高效革命

以上内容来自杰夫•萨瑟兰的《敏捷革命》
这本书。

必发365乐趣网投手机版 7

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图