整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

解密JavaScript的装饰器和方法转发(call

解密JavaScript的装饰器和方法转发(call & apply)

家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力

今天我们来聊聊装饰器和方法转发(callapply方法),这些强大的工具可以让你的代码更清晰、更模块化、更易于理解。

什么是装饰器?

装饰器是一种设计模式,用于修改或增强函数或类的行为。在 JavaScript 中,装饰器还不是标准特性,但你可以通过 Babel 或 TypeScript 等库来使用它们。简单来说,装饰器是一个函数,它接收另一个函数或类,并返回一个添加了新功能的版本。

来看一个简单的例子:

function logger(target, name, descriptor) {
    const originalMethod=descriptor.value;
    descriptor.value=function(...args) {
        console.log(`Calling ${name} with`, args);
        return originalMethod.apply(this, args);
    };
    return descriptor;
}

class Example {
    @logger
    greet(name) {
        return `Hello, ${name}!`;
    }
}

const example=new Example();
console.log(example.greet('Alice'));
// 输出: Calling greet with [ 'Alice' ]
// 输出: Hello, Alice!

在 上面的代码中,logger装饰器记录了每次对greet方法的调用,显示方法的名称和参数,然后再执行它。

使用call和apply进行方法转发

接下来,让我们讨论方法转发,这是一种将函数的执行委托给另一个上下文的技术。这时,callapply方法就派上用场了。两者都用于指定this值调用函数,但处理参数的方式不同。

  • call:使用给定的this值和单独提供的参数调用函数。
function sayHi() {
    console.log(`Hi, my name is ${this.name}`);
}

const person={ name: 'Alice' };

sayHi.call(person); // 输出: Hi, my name is Alice
  • apply:使用给定的this值和作为数组提供的参数调用函数。
function introduce(greeting, punctuation) {
    console.log(`${greeting}, my name is ${this.name}${punctuation}`);
}

const person={ name: 'Alice' };

introduce.apply(person, ['Hello', '!']); // 输出: Hello, my name is Alice!

当你想借用一个对象的方法并在另一个上下文中使用时,callapply特别有用。

将装饰器与call和apply结合使用

装饰器和方法转发可以结合起来,创建出高度灵活且可重用的代码。让我们修改之前的例子来展示这一点:

function logger(target, name, descriptor) {
    const originalMethod=descriptor.value;
    descriptor.value=function(...args) {
        console.log(`Calling ${name} with`, args);
        return originalMethod.apply(this, args);
    };
    return descriptor;
}

function forward(method, context, args) {
    return method.apply(context, args);
}

class Example {
    @logger
    greet(name) {
        return `Hello, ${name}!`;
    }

    @logger
    farewell(name) {
        return `Goodbye, ${name}!`;
    }

    forwardGreet(name) {
        return forward(this.greet, this, [name]);
    }

    forwardFarewell(name) {
        return forward(this.farewell, this, [name]);
    }
}

const example=new Example();
console.log(example.forwardGreet('Alice'));
// 输出: Calling greet with [ 'Alice' ]
// 输出: Hello, Alice!
console.log(example.forwardFarewell('Bob'));
// 输出: Calling farewell with [ 'Bob' ]
// 输出: Goodbye, Bob!

在这段代码中,我们使用forward函数来委托对greetfarewell方法的调用,确保日志装饰器仍然捕获并记录方法调用。

总结

一句话:装饰器和callapply方法转发可以在你成为秀儿的路上更进一小步 。

最后

如果你有任何问题或建议,欢迎在评论区留言交流!Happy coding!

中级

学习时间

半小时

学前准备

有一定编程经验。

开发语言

Typescript

开发环境

  • Node.js v10.9.0
  • npm v6.2.0
  • WebStorm v2018.2.3
  • Angular CLI v6.1.5

1.主页面“index.html”官方描述

什么是“index.html”?

官方是这样描述的:

这是别人访问你的网站是看到的主页面的 HTML 文件。 大多数情况下你都不用编辑它。 在构建应用时,CLI 会自动把所有 js 和 css 文件添加进去,所以你不必在这里手动添加任何 <script> 或 <link> 标签。

从中我们可以得出以下三点:

  1. “index.html”是用户访问我们网站第一个看到的页面。
  2. 在构建Angular应用时,Angular CLI会自动的将所需的 JS 和 CSS 文件添加到“index.html”中。
  3. 如需第三方 JS 或 CSS 则手动添加。

“index.html”位置及内容如下:

具体内容:

这就是一个普通的html。

里面只说两点,第一点是我们之前讲解过的网站头像“favicon.ico”,还有一点是没有讲解过的“app-root”组件选择器。后者是重点。

2.网站头像“favicon.ico”

首先,我们来看看网站头像,这个之前讲解过,但是在“index.html”里面还没有讲解。

涉及到的代码如下:

这是一个icon的引用,将“favicon.ico”设置为网站头像。

注意看,href属性值直接写的是“favicon.ico”,也就是说“favicon.ico”所在的目录是和“index.html”是同一个目录。

3.“app-root”组件选择器

接着往下看,我们会看到一个比较奇怪的标签:

Q:这个标签叫什么?

这个叫组件选择器也叫CSS选择器。

Q:什么叫组件选择器?

从它的名字中可以得知两点:组件和选择器。其中选择器是组件在HTML中的名字。

Q:什么是组件?

官方描述:

组件控制屏幕上被称为视图的一小片区域。

不知道对官方描述有没有理解,没理解也没关系,下一章就会详细讲解到什么组件。

Q:app-root这个组件选择器实际对应的组件是什么?

app-root组件选择器对应的是应用中AppComponent组件。

Q:AppComponent组件在哪?

如图所示,中app目录下的“app.component.ts”文件中,用Typescript写成。

它的具体内容如下:

Q:我在图片中看到了“app-root”,想问包括它自身所在的这一行是什么意思?

官方描述:

selector:是一个 CSS 选择器,它会告诉 Angular,一旦在模板 HTML 中找到了这个选择器对应的标签,就创建并插入该组件的一个实例。 比如,如果应用的 HTML 中包含 <app-root></app-root>,Angular 就会在这些标签中插入一个 AppComponent 实例的视图。

这个描述应该很清楚了,将组件的视图插入到选择器所在的位置。

至此,“index.html”相关的讲解就先告一段落了,里面还有其它没有讲解的内容暂时不作重点。

后续还会再接触的,用到时再作分析。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

Angular第十八章:应用入口“main.ts”

下一章

Angular第二十章:app开发目录

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:通过关注我们的头条号,然后私信我们。
  • 方式二:通过公众号gorhaf,回复“Angular学习小组”。

关注我们

如果你也热爱前沿技术,欢迎关注我们。

版权声明

原创不易,未经允许不得转载!

费智能改写工具有哪些?

人工智能时代的全新体验

随着信息技术的迅速发展,人工智能已经悄然融入我们的日常生活。从语音助手到智能写作,AI正在为我们带来前所未有的便利与可能。而华为最新推出的HarmonyOSNEXT系统更是让这一切触手可及,为我们开启了更加智能化的未来。

当我们可以与系统进行自然交流,让它理解我们的需求并提供贴心的建议时,工作效率将会大幅提升。智能写作工具正是这一趋势的最佳注脚。它们能够快速生成高质量的文案,不仅满足了人们对速度的需求,更确保了内容的逻辑性和说服力。

迅捷AI写作就是其中的佼佼者。它依托先进的算法,能够在短时间内生成具有条理性和严谨结构的文本。对于需要大量写作任务的工作,这无疑是一大福音。

而Copy.ai则擅长于营销文案的生成。它通过学习大家的需求和市场动态,创作出富有感染力的内容,让企业的产品和服务更容易被消费者接受。

对于学术写作来说,Quillbot可谓是不可或缺的助手。它能够快速整合和改写文献资料,确保学术论点的连贯性和严谨性,大幅提升写作效率。

在跨文化内容创作领域,Jasper同样有出色表现。它深入理解不同文化背景,生成符合当地特点的文本,在全球化时代发挥着重要作用。

NotionAI则擅长于结构化的内容管理和规划。它帮助用户快速梳理思路,生成层次分明的文章,让写作过程井然有序。

当然,我们不能忽视语音交互在智能写作中的重要性。小爱同学凭借其语音功能,让用户能够即时获得反馈,大大提高了写作效率。尽管语音为主,但它同样确保了内容的逻辑性和准确性。

总的来说,这些智能写作工具正在为我们带来全新的体验。它们不仅大幅提升了写作效率,更通过智能分析、深度学习等技术确保了内容的质量。相信在不久的将来,我们会看到更多令人惊叹的AI应用,让工作变得更加轻松愉快。

HarmonyOSNEXT无疑是这一趋势的最佳注脚。它不仅在性能上有所提升,更在AI智能方面带来了革命性的变革。一个能够理解你、适应你的操作系统,无疑让未来触手可及。让我们一起探索这个全新的智能世界,开启更加精彩的生活!

&lt;details&gt;

&lt;summary&gt;HTML Code&lt;/summary&gt;

html

好的,我将继续补充下去,确保内容的连贯性和逻辑性。

这些智能写作工具无疑为我们的生活带来了巨大的变革。随着技术的不断进步,未来我们还会看到更多令人兴奋的AI应用。比如说,基于语音交互的智能助手不仅能帮助我们快速生成内容,还能提供个性化的建议和灵感。它们不仅能理解我们的需求,还能根据上下文自动调整输出,让整个写作过程变得更加顺畅。

另一个值得期待的领域是多模态内容生成。这种技术能够将文字、图像、音频等不同形式的内容有机结合,让我们的创作变得更加丰富多彩。想象一下,你只需要简单地描述一个场景,AI就能自动生成一篇配有插图和背景音乐的文章。这将大大拓展我们的创作空间,让内容更具吸引力和互动性。

此外,基于知识图谱的内容生成也将成为未来的重点方向。这种技术能够自动整合各类信息资源,构建起丰富的知识网络。AI可以利用这些知识,快速生成结构清晰、观点深入的内容。对于需要大量研究和梳理的专业领域,这将是一大利器。

总之,我们正处于一个AI飞速发展的时代。这些智能写作工具只是冰山一角,未来必将涌现出更多令人惊叹的应用。让我们一起期待科技创造出的无限可能,在这个智能时代中谱写出更加精彩的人生篇章。