关于javascript装饰的信息-成都快上网建站

关于javascript装饰的信息

Html,Javascript,Css是什么?

HTML(Hypertext Markup Language)。HTML是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等)。浏览器按顺序阅读网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出错部位。但需要注意的是,对于不同的浏览器,对同一标记符可能会有不完全相同的解释,因而可能会有不同的显示效果。

创新互联建站-专业网站定制、快速模板网站建设、高性价比清河网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式清河网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖清河地区。费用合理售后完善,10多年实体公司更值得信赖。

Javascript,JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。它最初由网景公司的Brendan Eich设计,是一种动态、弱类型、基于原型的语言,内置支持类。JavaScript是Sun公司的注册商标。[1] Ecma国际以JavaScript为基础制定了ECMAScript标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,字节顺序记号。

CSS(Cascading Style Sheet)可译为“层叠样式表”或“级联样式表”,它定义如何显示 HTML 元素,用于控制Web页面的外观。通过使用CSS实现页面的内容与表现形式分离,极大提高了工作效率 。样式存储在样式表中,通常放在head部分或存储在 外部CSS文件中。作为网页标准化设计的趋势,CSS取得了浏览器厂商的广泛支持,正越来越多的被应用到网页设计中去。

看了上面东西,你可能会晕,其实这三个东西就是之制作网页的三种技术。一时间也无法能够让你明白它具体是什么,如若有兴趣,可以到看看,这个网站是介绍html5的,html5是html的最新版本,要了解,当然要了解最新的!

js和javascript的区别

简而言之,js就是JavaScript。

JS或js,是JavaScript的缩写形式,而JavaScript是一种基于对象和事件驱动并且具有相对安全性的客户端脚本语言。

它在Web开发中JS占据着举足轻重的地位,所有交互、逻辑层的代码都应该由它来实现。

如果把网站建设比喻成盖楼房,那么HTML就是这个楼房的钢筋水泥,CSS就是楼房的布局装饰,而JS就是楼房中大大小小无处不在的开关了。

从这样的角度而言,JS就是Web开发中负责逻辑层的语言,而现如今相当火热的“用户体验”的概念,最重要的代码部分还是需要JS来编写。

JS的引入方式大体可以分为两种:

第一种是直接写入当前页面中,需要写在标签之间即可。

第二种是写入一个js的文件中。

有时候,js是一种文件的扩展名,JavaScript是一种计算机语言,通常用作扩展名是用js。

但是,如果勉强去说区别的话:

js是javascript文件的扩展名,例如xx.js,javascript是一种程序语言,主要用于网页的特效、功能的脚本编程,是一种很强大的脚本语言,在网站的前台处理几乎是无所不能。

[img]

分别叙述前端三大技术HTML、CSS和JavaScript的概念和特点?

一个基本的网站包含很多个网页,一个网页由html, css和javascript组成。

html是主体,装载各种dom元素;(主体建筑)

css用来装饰dom元素;(静态装修)

javascript控制dom元素。(动态装修)

用一扇门比喻三者间的关系是:html是门的门板,css是门上的油漆或花纹,javascript是门的开关;

QQ空间各种装饰代码是什么

javascript:window.top.space_addItem(1,9465,0,80,0,0,90);

javascript:window.top.space_addItem(1,9361,0,80,0,0,90);

javascript:window.top.space_addItem(1,9362,0,80,0,0,90);

javascript:window.top.space_addItem(1,8980,0,80,0,0,90);

javascript:window.top.space_addItem(1,8974,0,80,0,0,90);

javascript:window.top.space_addItem(1,8032,0,80,0,0,90);

javascript:window.top.space_addItem(1,7981,0,80,0,0,90);

javascript:window.top.space_addItem(1,7288,0,80,0,0,90);

javascript:window.top.space_addItem(1,7182,0,80,0,0,90);

javascript:window.top.space_addItem(1,7183,0,80,0,0,90);

javascript:window.top.space_addItem(1,6729,0,80,0,0,90);

javascript:window.top.space_addItem(1,6549,0,80,0,0,90);

javascript:window.top.space_addItem(1,6550,0,80,0,0,90);

javascript:window.top.space_addItem(1,6551,0,80,0,0,90);

javascript:window.top.space_addItem(1,6552,0,80,0,0,90);猪

javascript:window.top.space_addItem(1,6553,0,80,0,0,90);

javascript:window.top.space_addItem(1,6554,0,80,0,0,90);

javascript:window.top.space_addItem(1,6556,0,80,0,0,90);

javascript:window.top.space_addItem(1,6557,0,80,0,0,90);

javascript:window.top.space_addItem(1,6559,0,80,0,0,90);

javascript:window.top.space_addItem(1,6398,0,80,0,0,90);

javascript:window.top.space_addItem(1,6399,0,80,0,0,90);

javascript:window.top.space_addItem(1,6400,0,80,0,0,90);还好

javascript:window.top.space_addItem(1,6401,0,80,0,0,90);

javascript:window.top.space_addItem(1,6274,0,80,0,0,90);

javascript:window.top.space_addItem(1,6071,0,80,0,0,90);

javascript:window.top.space_addItem(1,3675,0,80,0,0,90);

javascript:window.top.space_addItem(1,2942,0,80,0,0,90);

javascript:window.top.space_addItem(1,2875,0,80,0,0,90);

javascript:window.top.space_addItem(1,2877,0,80,0,0,90);

javascript:window.top.space_addItem(1,2876,0,80,0,0,90);

javascript:window.top.space_addItem(1,2668,0,80,0,0,90);

javascript:window.top.space_addItem(1,2468,0,80,0,0,90);

javascript:window.top.space_addItem(1,2467,0,80,0,0,90);

javascript:window.top.space_addItem(1,2464,0,80,0,0,90);

javascript:window.top.space_addItem(1,2465,0,80,0,0,90);

javascript:window.top.space_addItem(1,2466,0,80,0,0,90);

javascript:window.top.space_addItem(1,3785,0,80,0,0,90);

javascript:window.top.space_addItem(1,3677,0,80,0,0,90);

javascript:window.top.space_addItem(1,3206,0,80,0,0,90);

javascript:window.top.space_addItem(1,1028,0,80,0,0,90);

javascript:window.top.space_addItem(1,1770,0,80,0,0,90);

javascript:window.top.space_addItem(1,1773,0,80,0,0,90);

javascript:window.top.space_addItem(1,1109,0,80,0,0,90);

javascript:window.top.space_addItem(1,1629,0,80,0,0,90);

javascript:window.top.space_addItem(1,1113,0,80,0,0,90);

javascript:window.top.space_addItem(1,1108,0,80,0,0,90);

javascript:window.top.space_addItem(1,1107,0,80,0,0,90);

javascript:window.top.space_addItem(1,1034,0,80,0,0,90);

javascript:window.top.space_addItem(1,1033,0,80,0,0,90);

javascript:window.top.space_addItem(1,1030,0,80,0,0,90);

javascript:window.top.space_addItem(1,1029,0,80,0,0,90);好看的

javascript:window.top.space_addItem(1,1025,0,80,0,0,90);

javascript:window.top.space_addItem(1,1023,0,80,0,0,90);

javascript:window.top.space_addItem(1,1022,0,80,0,0,90);

javascript:window.top.space_addItem(1,16140,0,80,0,0,90);

javascript:window.top.space_addItem(1,15846,0,80,0,0,90);

javascript:window.top.space_addItem(1,14849,0,80,0,0,90);

javascript:window.top.space_addItem(1,13608,0,80,0,0,90);

javascript:window.top.space_addItem(1,13611,0,80,0,0,90);

javascript:window.top.space_addItem(1,13289,0,80,0,0,90);

javascript:window.top.space_addItem(1,13290,0,80,0,0,90);

javascript:window.top.space_addItem(1,12920,0,80,0,0,90);

javascript:window.top.space_addItem(1,12789,0,80,0,0,90);

javascript:window.top.space_addItem(1,12790,0,80,0,0,90);漂亮

javascript:window.top.space_addItem(1,11991,0,80,0,0,90);漂亮

javascript:window.top.space_addItem(1,11993,0,80,0,0,90);

javascript:window.top.space_addItem(1,11996,0,80,0,0,90);好看的

javascript:window.top.space_addItem(1,11997,0,80,0,0,90);

javascript:window.top.space_addItem(1,11602,0,80,0,0,90);

javascript:window.top.space_addItem(1,11605,0,80,0,0,90);漂亮+此款禁区情人强推之作

javascript:window.top.space_addItem(1,11237,0,80,0,0,90);

javascript:window.top.space_addItem(1,10812,0,80,0,0,90);漂亮 此款也不错

javascript:window.top.space_addItem(1,10811,0,80,0,0,90);

javascript:window.top.space_addItem(1,10497,0,80,0,0,90);

javascript:window.top.space_addItem(1,10107,0,80,0,0,90);

javascript:window.top.space_addItem(1,9781,0,80,0,0,90);好看的

javascript:window.top.space_addItem(1,8981,0,80,0,0,90);

javascript:window.top.space_addItem(1,8978,0,80,0,0,90);

javascript:window.top.space_addItem(1,8977,0,80,0,0,90);

javascript:window.top.space_addItem(1,8975,0,80,0,0,90);

javascript:window.top.space_addItem(1,8522,0,80,0,0,90);

javascript:window.top.space_addItem(1,8588,0,80,0,0,90);

javascript:window.top.space_addItem(1,8589,0,80,0,0,90);

javascript:window.top.space_addItem(1,8030,0,80,0,0,90);

javascript:window.top.space_addItem(1,7978,0,80,0,0,90);

javascript:window.top.space_addItem(1,7977,0,80,0,0,90);个性的

javascript:window.top.space_addItem(1,7945,0,80,0,0,90);

javascript:window.top.space_addItem(1,7286,0,80,0,0,90);

javascript:window.top.space_addItem(1,7145,0,80,0,0,90);

javascript:window.top.space_addItem(1,7146,0,80,0,0,90);

javascript:window.top.space_addItem(1,6811,0,80,0,0,90);

javascript:window.top.space_addItem(1,5867,0,80,0,0,90);

javascript:window.top.space_addItem(1,5627,0,80,0,0,90);

javascript:window.top.space_addItem(1,5628,0,80,0,0,90);

javascript:window.top.space_addItem(1,4796,0,80,0,0,90);

javascript:window.top.space_addItem(1,4795,0,80,0,0,90);好看的

javascript:window.top.space_addItem(1,4797,0,80,0,0,90);

javascript:window.top.space_addItem(1,4311,0,80,0,0,90);

javascript:window.top.space_addItem(1,4315,0,80,0,0,90);

javascript:window.top.space_addItem(1,4319,0,80,0,0,90);

javascript:window.top.space_addItem(1,4323,0,80,0,0,90);

javascript:window.top.space_addItem(1,4327,0,80,0,0,90);

javascript:window.top.space_addItem(1,4331,0,80,0,0,90);

javascript:window.top.space_addItem(1,2667,0,80,0,0,90);

javascript:window.top.space_addItem(1,1772,0,80,0,0,90);

javascript:window.top.space_addItem(1,1771,0,80,0,0,90);

javascript:window.top.space_addItem(1,1032,0,80,0,0,90);

javascript:window.top.space_addItem(1,1633,0,80,0,0,90);

javascript:window.top.space_addItem(1,1919,0,80,0,0,90);

javascript:window.top.space_addItem(1,1924,0,80,0,0,90);好看的

javascript:window.top.space_addItem(1,1756,0,80,0,0,90);

javascript:window.top.space_addItem(1,1634,0,80,0,0,90);

javascript:window.top.space_addItem(1,1631,0,80,0,0,90);

javascript:window.top.space_addItem(1,16309,0,80,0,0,90);

javascript:window.top.space_addItem(1,15847,0,80,0,0,90);

javascript:window.top.space_addItem(1,14851,0,80,0,0,90);

javascript:window.top.space_addItem(1,15438,0,80,0,0,90);

javascript:window.top.space_addItem(1,14168,0,80,0,0,90);

javascript:window.top.space_addItem(1,14057,0,80,0,0,90);

javascript:window.top.space_addItem(1,13606,0,80,0,0,90);

javascript:window.top.space_addItem(1,13607,0,80,0,0,90);

javascript:window.top.space_addItem(1,13609,0,80,0,0,90);好看的

javascript:window.top.space_addItem(1,11998,0,80,0,0,90);漂亮

javascript:window.top.space_addItem(19,15334,0,0,0,1,0);

名称:黑舞蝶 颜色:黑色

javascript:window.top.space_addItem(19,15336,0,0,0,1,0);

名称:蝴蝶梦 颜色:黑色

javascript:window.top.space_addItem(19,15337,0,0,0,1,0);

名称:花火 颜色:橙色

javascript:window.top.space_addItem(19,15338,0,0,0,1,0);

名称:幻 颜色:深蓝色

javascript:window.top.space_addItem(19,15339,0,0,0,1,0);

名称:晦暗的心情 颜色:黑色

javascript:window.top.space_addItem(19,15340,0,0,0,1,0);

名称:浪漫莲花 颜色:黑色

javascript:window.top.space_addItem(19,15341,0,0,0,1,0);

名称:暖洋洋 颜色:白色

javascript:window.top.space_addItem(19,15347,0,0,0,1,0);

名称:天体观测 颜色:黑色

javascript:window.top.space_addItem(19,15350,0,0,0,1,0);

名称:五月花 颜色:浅蓝色

javascript:window.top.space_addItem(19,15352,0,0,0,1,0);

名称:线香 颜色:深蓝色

javascript:window.top.space_addItem(19,15353,0,0,0,1,0);

名称:心灵深处 颜色:红色

javascript:window.top.space_addItem(19,15355,0,0,0,1,0);

名称:心桥 颜色:灰色

javascript:window.top.space_addItem(19,15356,0,0,0,1,0);

名称:夜萤 颜色:蓝色

javascript:window.top.space_addItem(19,15359,0,0,0,1,0);

名称:永恒的爱 颜色:粉色

javascript:window.top.space_addItem(19,15360,0,0,0,1,0);

名称:终极界限 颜色:深蓝色

javascript:window.top.space_addItem(19,15365,0,0,0,1,0);

名称:仲夏夜之梦 颜色:绿色

javascript:window.top.space_addItem(19,15366,0,0,0,1,0);

名称:爱的承诺 颜色:蓝色

javascript:window.top.space_addItem(19,15303,0,0,0,1,0);

名称:MySoul 颜色:黑色

javascript:window.top.space_addItem(19,15302,0,0,0,1,0);

名称:ICE 颜色:蓝色

javascript:window.top.space_addItem(19,15301,0,0,0,1,0);

首先我们进入自己的空间,点自定义

然后在地址栏输入如下代码

例如:

javascript:window.top.space_addItem(7,6552,0,0,0,1,0);

按回车键。花和人参果就出现了,这个时候随便移动一个模块, (为了能保存方案,)

稍微挪动一下就可以了。然后保存方案。 这样花和果实就都留下来了。刷新看看吧

注意,人参果不能摘的!!!只有3个效果,

第一: 能养五级花,如果想换花。去装扮空间--养植物---五级花---选择一个喜欢的 右键察看属性看花的编号

第二:开花效果。 植物的叶子会更加茂盛,直接开花

第三: 附带一个金色人参果

javascript:window.top.space_addItem(7,2668,0,0,0,1,0); 紫铃儿

javascript:window.top.space_addItem(7,2468,0,0,0,1,0); 我心依旧

javascript:window.top.space_addItem(7,2467,0,0,0,1,0); 美人鱼

javascript:window.top.space_addItem(7,2464,0,0,0,1,0); 黑玫瑰

javascript:window.top.space_addItem(7,2465,0,0,0,1,0); 烈艳红唇

javascript:window.top.space_addItem(7,2466,0,0,0,1,0); 绿茶飘香

html,css,javascript在制作网页中的作用,三者之间有何种联系

html:超文本标记语言,是为“网页创建和其它可在网页浏览器中看到的信息”设计的一种标记语言。

css:层叠样式表,是一种用来表现HTML或XML等文件样式的计算机语言。

javascript:一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。

每一个网页都是一个html文档,由浏览器解释呈现的。css是html中用来布局表现的。而javascript是html中用来动态交互的脚本。

如何在 TypeScript 中使用装饰器

TypeScript 是 JavaScript 语言的扩展,它使用 JavaScript 的运行时和编译时类型检查器。

这种组合允许开发人员使用完整的 JavaScript 生态系统和语言功能,同时,还可以在其之上添加可选的静态类型检查、枚举、类和接口。这些额外功能之一是装饰器的支持。

装饰器是一种装饰类成员或类本身的方法,具有额外的功能。

当我们将装饰器应用于类或类成员时,我们实际上是在调用一个函数,该函数将接收被装饰内容的详细信息,然后,装饰器实现将能够动态转换代码,添加额外的功能,并且 减少样板代码。

它们是在 TypeScript 中进行元编程的一种方式,TypeScript 是一种编程技术,使程序员能够创建使用来自应用程序本身的其他代码作为数据的代码。

本教程将分享如何在 TypeScript 中为类和类成员创建自己的装饰器,以及如何使用它们。

它将引导我们完成不同的代码示例,我们可以在自己的 TypeScript 环境或 TypeScript Playground(一个允许我们直接在浏览器中编写 TypeScript 的在线环境)中遵循这些示例。

准备工作

要完成本教程实例,我们需要做如下准备:

在 TypeScript 中启用装饰器支持

目前,装饰器在 TypeScript 中仍然是一个实验性功能,因此,必须先启用它。在本节中,我们将了解如何在 TypeScript 中启用装饰器,具体取决于您使用 TypeScript 的方式。

TypeScript 编译器 CLI

要在使用 TypeScript Compiler CLI (tsc) 时启用装饰器支持,唯一需要的额外步骤是传递一个附加标志 --experimentalDecorators:

tsconfig.json

在具有 tsconfig.json 文件的项目中工作时,要启用实验性装饰器,我们必须将实验性装饰器属性添加到 compilerOptions 对象:

在 TypeScript Playground 中,装饰器默认启用。

使用装饰器语法

在本节中,我们将在 TypeScript 类中应用装饰器。

在 TypeScript 中,我们可以使用特殊语法 @expression 创建装饰器,其中 expression 是一个函数,将在运行时自动调用,其中包含有关装饰器目标的详细信息。

装饰器的目标取决于我们添加它们的位置。 目前,装饰器可以添加到类的以下组件中:

例如,假设我们有一个名为 seal 的装饰器,它在类中调用 Object.seal。 要使用我们的装饰器,我们可以编写以下内容:

这同样适用于所有其他类型的装饰器:

要添加多个装饰器,请将它们一个接一个地添加在一起:

在 TypeScript 中创建类装饰器

在本节中,我们将完成在 TypeScript 中创建类装饰器的步骤。

对于名为 @decoratorA 的装饰器,我们告诉 TypeScript 它应该调用函数 decoratorA。 将调用 decoratorA 函数,其中包含有关如何在代码中使用装饰器的详细信息。

要创建自己的装饰器,我们必须创建一个与装饰器同名的函数。 也就是说,要创建您在上一节中看到的密封类装饰器,您必须创建一个接收一组特定参数的密封函数。 让我们这样做:

传递给装饰器的参数将取决于装饰器的使用位置。第一个参数通常称为目标。

然后,在密封函数中,在目标(即类构造函数)以及它们的原型上调用 Object.seal。当这样做时,不能将新属性添加到类构造函数或其属性中,并且现有属性将被标记为不可配置。

重要的是要记住,目前在使用装饰器时无法扩展目标的 TypeScript 类型。这意味着,例如,你无法使用装饰器将新字段添加到类并使其成为类型安全的。

如果在密封类装饰器中返回了一个值,该值将成为该类的新构造函数。如果想完全覆盖类构造函数,这很有用。

已经创建了第一个装饰器,并将它与一个类一起使用。

接下来,我们将学习如何创建装饰器工厂。

创建装饰器工厂

有时,我们需要在应用装饰器时将其他选项传递给装饰器,为此,我们必须使用装饰器工厂。

在这里,我们将学习如何创建和使用这些工厂。

装饰器工厂是返回另一个函数的函数。他们收到这个名字是因为他们不是装饰器实现本身。

相反,它们返回另一个负责实现装饰器的函数并充当包装函数。通过允许客户端代码在使用装饰器时将选项传递给装饰器,它们在使装饰器可定制方面很有用。

假设,有一个名为 decoratorA 的类装饰器,并且,我们想添加一个可以在调用装饰器时设置的选项,例如,布尔标志,可以通过编写类似于以下的装饰器工厂来实现此目的:

在这里,decoratorA 函数返回另一个带有装饰器实现的函数。 注意,装饰器工厂如何接收一个布尔标志作为它的唯一参数:

我们可以在使用装饰器时传递此参数的值。

请参阅以下示例中突出显示的代码:

在这里,当我们使用 decoratorA 装饰器时,将调用装饰器工厂,并将 someBooleanFlag 参数设置为 true。

然后,装饰器实现本身将运行。 这允许我们根据使用方式更改装饰器的行为,从而,使我们的装饰器易于自定义和通过应用程序重用。

请注意,我们需要传递装饰器工厂预期的所有参数。 如果,我们只是应用装饰器而不传递任何参数,如下例所示:

TypeScript 编译器会给你两个错误,这可能会因装饰器的类型而异。 对于类装饰器,错误是 1238 和 1240:

我们刚刚创建了一个能够接收参数并根据这些参数更改其行为的装饰器工厂。

在下一步中,我们将学习如何创建属性装饰器。

创建属性装饰器

类属性是另一个可以使用装饰器的地方,在这里,我们将了解如何创建它们。

任何属性装饰器都接收以下参数:

目前,没有办法获取属性描述符作为参数。 这是由于 TypeScript 中属性装饰器的初始化方式。

这是一个装饰器函数,它将成员的名称打印到控制台:

当我们运行上面的 TypeScript 代码时,你会在控制台中看到如下打印:

我们可以使用属性装饰器来覆盖被装饰的属性。这可以通过Object.defineProperty与属性的新 setter 和 getter 一起使用来完成。

让我们看看如何创建一个名为 的装饰器allowlist,它只允许将属性设置为静态允许列表中存在的值:

首先,我们要在代码顶部创建一个静态许可名单:

然后,我们创建一个属性装饰器:

请注意,我们如何使用 any 作为目标的类型:

对于属性装饰器来说,目标参数的类型可以是类的构造函数,也可以是类的原型,在这种情况下使用any比较容易。

在装饰器实现的第一行中,我们将被装饰的属性的当前值存储到 currentValue 变量中:

对于静态属性,这将设置为其默认值(如果有)。

对于非静态属性,这将始终未定义。 这是因为在运行时,在编译的 JavaScript 代码中,装饰器在实例属性设置为其默认值之前运行。

然后,我们将使用 Object.defineProperty 覆盖该属性:

Object.defineProperty 调用有一个 getter 和一个 setter。 getter 返回存储在 currentValue 变量中的值。

如果 currentVariable 在允许列表中,setter 会将其值设置为 newValue。

让我们使用您刚刚编写的装饰器。 创建以下 Person 类:

我们现在将创建类的新实例,并测试设置并获取name实例属性:

运行代码,我们应该看到以下输出:

该值永远不会设置为 Peter,因为 Peter 不在允许列表中。

如果我们想让代码更具可重用性,允许在应用装饰器时设置允许列表,该怎么办? 这是装饰器工厂的一个很好的用例。

让我们通过 allowlistOnly 装饰器变成装饰器工厂来做到这一点。

在这里,我们将之前的实现包装到另一个函数中,即装饰器工厂。 装饰器工厂接收一个名为允许列表的参数,它是一个字符串数组。

现在,要使用的装饰器,我们必须通过许可名单,如以下突出显示的代码所示:

尝试运行与之前编写的代码类似的代码,但有新的更改:

输出如下:

显示它按预期工作,person.name 永远不会设置为 Peter,因为 Peter 不在给定的白名单中。

现在,我们已经使用普通装饰器函数和装饰器工厂创建了第一个属性装饰器,是时候看看如何为类访问器创建装饰器了。

创建访问器装饰器

在这里,我们将了解装饰类访问器。

就像属性装饰器一样,访问器中使用的装饰器接收以下参数:

但与属性装饰器不同的是,它还接收第三个参数,即访问器成员的属性描述符。

鉴于 Property Descriptors 包含特定成员的 setter 和 getter,访问器装饰器只能应用于单个成员的 setter 或 getter,而不能同时应用于两者。

如果我们从访问器装饰器返回一个值,该值将成为 getter 和 setter 成员的访问器的新属性描述符。

下面是一个可用于更改 getter/setter 访问器的可枚举标志的装饰器示例:

请注意示例中,我们是如何使用装饰器工厂的。 这允许我们在调用装饰器时指定可枚举标志。

以下是如何使用装饰器:

访问器装饰器类似于属性装饰器。 唯一的区别是它们接收带有属性描述符的第三个参数。 现在,我们已经创建了第一个访问器装饰器。

接下来,我们将学习如何创建方法装饰器。

创建方法装饰器

在这里,我们将学习如何使用方法装饰器。

方法装饰器的实现与创建访问器装饰器的方式非常相似。 传递给装饰器实现的参数与传递给访问器装饰器的参数相同。

让我们重用之前创建的同一个可枚举装饰器,但这次是在以下 Person 类的 getFullName 方法中:

如果我们从方法装饰器返回一个值,该值将成为该方法的新属性描述符。

让我们创建一个deprecated的装饰器,它在使用该方法时将传递的消息打印到控制台,记录一条消息说该方法已被弃用:

在这里,我们正在使用装饰器工厂创建装饰器。 这个装饰器工厂接收一个字符串类型的参数,这是弃用的原因,如下面突出显示的部分所示:

deprecationReason 将在稍后将弃用消息记录到控制台时使用。在不推荐使用装饰器的实现中,我们正在返回一个值。当我们从方法装饰器返回值时,该值将覆盖该成员的属性描述符。

我们正在利用这一点为装饰类方法添加一个吸气剂。这样,我们就可以更改方法本身的实现。

但是为什么不直接使用 Object.defineProperty 而不是为方法返回一个新的属性装饰器呢?这是必要的,因为,我们需要访问 this 的值,对于非静态类方法,它绑定到类实例。

如果,我们直接使用 Object.defineProperty ,将无法检索 this 的值,并且如果该方法以任何方式使用 this ,则当从装饰器实现中运行包装的方法时,装饰器会破坏我们的代码。

在这样情况下,getter 本身的 this 值绑定到非静态方法的类实例,并绑定到静态方法的类构造函数。

然后,在你的 getter 中创建一个本地包装函数,称为 wrapperFn,此函数使用 console.warn 将消息记录到控制台,传递从装饰器工厂收到的 deprecationReason,然后使用 propertyDescriptor.value 调用原始方法。

apply(this, args),以这种方式调用原始方法,并将其 this 值正确绑定到类实例,以防它是非静态方法。

然后,我们将使用 defineProperty 覆盖类中方法的值。这就像一种记忆机制,因为对同一方法的多次调用将不再调用 getter,而是直接调用 wrapperFn。

我们现在正在使用 Object.defineProperty 将类中的成员设置为将wrapperFn 作为其值。

让我们使用已弃用的装饰器:

在这里,我们创建了一个具有两个属性的 TestClass:一个是静态的,一个是非静态的。 我们还创建了两种方法:一种是静态的,一种是非静态的。

然后,我们将已弃用的装饰器应用于这两种方法。 运行代码时,控制台中会出现以下内容:

这表明这两种方法都使用了包装函数正确包装,该函数将一条消息记录到控制台并说明弃用原因。

你现在已经使用 TypeScript 创建了你的第一个方法装饰器。

接下来,我们将学习如何创建 TypeScript 支持的最后一个装饰器类型,即参数装饰器。

创建参数装饰器

参数装饰器可以用在类方法的参数中。

在这里,我们将学习如何创建一个与参数一起使用的装饰器函数,

接收以下参数:

方法参数列表中参数的索引。

无法更改与参数本身相关的任何内容,因此,此类装饰器仅对观察参数使用本身有用(除非您使用更高级的东西,例如反射元数据)。

这是一个装饰器的示例,它打印被装饰的参数的索引以及方法名称:

然后,你可以像这样使用你的参数装饰器:

运行上述代码应在控制台中显示以下内容:

我们现在已经创建并执行了一个参数装饰器,并打印出返回装饰参数索引的结果。

总结

在本教程中,我们已经实现了 TypeScript 支持的所有装饰器,将它们与类一起使用,并了解了它们之间的区别。

现在可以开始编写自己的装饰器来减少代码库中的样板代码,或者更加自信地使用带有库(例如 Mobx)的装饰器。

以上就是我跟你分享的全部内容,如果你觉得有用,请记得分享给你身边的朋友,也许能够帮助到他。


网站标题:关于javascript装饰的信息
网页网址:http://kswjz.com/article/dsopihi.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流