参数装饰器
参数装饰器的使用位置较之前集中装饰器略有不同,它被使用在行内。
class Building { constructor() { this.name = “company”; } openDoor(@parameterDecorator num, @parameterDecorator zoz) { console.log(${num} door being open
); }}
const building = new Building();
function parameterDecorator(target, property, key) { console.log(“target”, target); if (property) { console.log(“property”, property); } if (key) { console.log(“key”, key); } console.log(“=end of decorator=====”);}
转换后的代码区别就比较明显了,babel并没有对其生成一个特定的函数对其进行特有的操作,而只在创建完类(构造函数)以及相关属性、方法后直接调用了开发者自己编写的装饰器函数:
var Building = /#PURE/function () { function Building() { _classCallCheck(this, Building);
this.name = “company”; }
_createClass(Building, [{ key: “openDoor”, value: function openDoor(num, zoz) { console.log(“”.concat(num, " door being open")); } }]);
parameterDecorator(Building.prototype, “openDoor”, 1); parameterDecorator(Building.prototype, “openDoor”, 0); return Building;}();
装饰器应用
使用参数——闭包
以上所有的案例,装饰器本身均没有使用任何参数。然实际应用中,经常会需要有特定的参数需求。我们再回到一开头的例子中verify(who),其中需要传入一个身份变量。哪又怎么做?我们少许改变一下类装饰器的代码:
const who = “Django”;@classDecorator(who)class Building { constructor() { this.name = “company”; }}
转换后得到
// …var who = “Django”;var Building = ((_dec = classDecorator(who)), _dec( (_class = function Building() { _classCallCheck(this, Building);
this.name = “company”; }) ) || _class);// …
请注意第4第5行,它先执行了装饰器,然后再用返回值将类(构造函数)送入。相对应的,我们就应该将构造函数写成下面这样:
function classDecorator(people) { console.log(hi~ ${people}
); return function (target) { console.log(“target”, target); };}
同样的,方法、存取器、属性和参数装饰器均是如此。
装饰器包裹方法
到此,我们已经可以将装饰器参数与目标对象结合起来,进行一些逻辑类的操作。那么再回到文章的开头的例子中:需求中要先验证来访者权限,然后记录,最后在来访者离开时再做一次记录。此时需要监管对象方法被调用的整个过程。
请大家留意那个方法装饰器的descriptor,我们可以利用这个对象来“重写”这个方法。
class Building { constructor() { this.name = “company”; }
@methodDecorator(“Gate”) openDoor(firstName, lastName) { return The door will be open, when ${firstName} ${lastName} is walking into the ${this.name}.
; }}
let building = new Building();console.log(building.openDoor(“django”, “xiang”));
function methodDecorator(door) { return function (target, property, descriptor) { let fn = descriptor.value; descriptor.value = function (…args) { let [firstName, lastName] = args; console.log(log: ${firstName}, who are comming.
); // verify(firstName,lastName) let result = Reflect.apply(fn, this, [firstName, lastName]); console.log(log: ${result}
); console.log(log: ${firstName}, who are leaving.
); return result; }; return descriptor; };}
代码第17行,将原方法暂存;18行定义一个新的方法,20~25行,记录、验证和记录离开的动作。
log: Django, who are comming.log: The door will be open, when Django Xiang is walking in to the company.log: Django, who are leaving.The door will be open, when Django Xiang is walking in to the company
装饰顺序
通过阅读转换后的代码,我们知道装饰器工作的时刻是在类被实例化之前,在生成之中完成装饰函数的动作。那么,如果不同类型的多个装饰器同时作用,其过程是怎样的?我们将先前的案例全部整合到一起看看:
const who = “Django”;@classDecorator(who)class Building { constructor() { this.name = “company”; }
@propertyDecorator roomNumber = “”;
@methodDecorator openDoor(@parameterDecorator num) { console.log(${num} door being open
); }
@accessorDecorator get roomNumber() { return this._roomNumber; }}
const building = new Building();
function classDecorator(people) { console.log(class decorator
); return function (target) { console.log(“target”, target); };}
function methodDecorator(target, property, descriptor) { console.log(“method decorator”);}
function accessorDecorator(target, property, descriptor) { console.log(“accessor decorator”);}
function propertyDecorator(target, property, descriptor) { console.log(“property decoator”);}
function parameterDecorator(target, property, key) { console.log(“parameter decorator”);}
-
class decorator
-
parameter decorator
-
property decoator
-
method decorator
-
accessor decorator
还可以通过阅读转换后的源代码得到执行顺序:
-
类装饰器(在最外层)
-
参数装饰器(在生成构造函数最里层)
-
按照出现的先后顺序的:属性、方法和存取器
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
总结
技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。
[外链图片转存中…(img-hop9EeqV-1712519627096)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-SgqKXU62-1712519627096)]