深入解析JavaScript中的装饰器模式、call/apply和转发

发布时间:2024年01月12日

🧑?🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》?、《JavaScript保姆级教程》《krpano》《krpano中文文档》

??

?

? 前言

????????在JavaScript的实际项目开发中,我们会接触到许多高级的编程技巧和模式,这些技巧和模式可以帮助我们编写更加优雅和高效的代码。本文主要聚焦三个非常重要且实用的技术点——装饰器模式、call/apply以及转发,这些技术点对于掌握JavaScript的核心概念大有裨益。

????????装饰器模式巧妙地扩展了对象的功能,而不改变对象本身的结构,是一种非常灵活的设计模式。call和apply可以帮助我们改变函数执行的上下文,对理解this的指向问题大有帮助。而转发可以实现函数的复用,是Javascript中实现继承和装饰的重要方法之一。

????????本文将带领大家一起了解这三个技术点的概念、用法及实际应用场景。通过学习这些技术,我们不仅可以写出更加专业的Javascript代码,也可以加深对语言本身的理解,提高编程技巧。下面让我们开始今天的JavaScript核心技术学习之旅!

?

? 正文

一、装饰器模式

  • 装饰器模式介绍:装饰器模式可以在不改变对象自身的基础上,在程序运行期间给对象动态添加职责。它通过创建一个包装对象,也就是装饰来包裹真实的对象。
  • 装饰器示例:
    function makeBold(fn) {
      return function () {
        return `<b>${fn()}</b>`;
      };
    }
    
    function makeItalic(fn) {
      return function () {
        return `<i>${fn()}</i>`; 
      };
    }
    
    function hello() {
      return 'hello world';
    }
    
    const boldHello = makeBold(hello);
    console.log(boldHello()); // <b>hello world</b>
    
    const italicHello = makeItalic(hello);
    console.log(italicHello()); // <i>hello world</i>
  • 装饰器使用场景:动态添加类的方法、扩展对象的功能等。

二、call和apply

????????call和apply都是Function原型上的方法,可以用来调用函数,并且可以在调用函数的同时改变函数内部this的指向。

????????call和apply的第一个参数都是this要指向的对象,也就是想指定的上下文。剩余的参数都会传给函数作为参数。

举个例子:

const obj = {
  name: '张三'  
};

function printName(age, gender){
  console.log(this.name, age, gender);
}

printName.call(obj, 20, '男'); 
// 张三 20 男

printName.apply(obj, [20, '男']);
// 张三 20 男

可以看到,call是直接传参,apply是数组传参。

call和apply的区别主要有以下两点:

  1. call方法接收的是参数列表,apply方法接收的是一个参数数组
  2. call可以传入null或者undefined作为第一个参数,这样函数内this就会指向默认的全局对象(浏览器中就是window对象),apply就不可以

call和apply的用途:

  1. 改变this指向
  2. 借助别的对象的方法
  3. Function.prototype.bind的底层实现

????????所以call和apply是非常重要的两个方法,可以帮助我们更好地理解this指向的改变和函数的灵活应用。掌握call和apply的用法对编写JavaScript代码大有裨益。

?详解:

  1. call和apply介绍:call和apply都是Function的方法,可以调用函数并且明确地指定this的指向和参数。
  2. call和apply语法:
    func.call(thisArg, arg1, arg2, ...)
    
    func.apply(thisArg, [argsArray])
  3. call和apply区别:
    • 调用方式不同,call接收参数列表,apply接收数组
    • 第一个参数都是表示this指向
  4. call和apply使用场景:
    • 改变this指向
    • Function.prototype.bind
    • 借助其他对象的方法

三、转发

  1. 转发介绍:调用函数时,将调用操作转发给另一个函数。
  2. 转发示例:
    function print(msg) {
      console.log(msg);
    }
    
    function forwardedPrint(msg) {
      print(msg);
    }
    
    forwardedPrint('hello'); // hello
  3. 转发使用场景:
  • 子类继承父类方法
  • AOP编程

? 结语? ? ? ??

????????通过本文的讲解,我们全面了解了JavaScript中三个非常重要且高级的技巧——装饰器模式、call/apply以及函数转发。这些技巧的应用可以让我们的代码更加规范、高效、优雅。

????????装饰器模式为对象提供了动态添加新功能的方式,而不需要直接修改对象本身。call和apply深刻说明了this绑定的原理,是掌握JavaScript执行上下文非常关键的两个方法。转发实现了函数的重复应用,是JavaScript中实现继承和装饰的常见手段。

????????这些技术手段对于编写灵活、可复用、可扩展的JavaScript代码大有裨益。当我们遇到需要动态扩展对象、改变this指向、实现函数复用的场景时,就可以熟练地应用这些技巧。

????????本文为大家深入浅出地解析了这些技术的工作原理、典型用法及应用场景。通过本文的学习,我们可以写出更加专业、高效的JavaScript代码,对JavaScript这门语言也有了更深的理解。技术的学习是一个不断深入的过程,希望大家可以继续探索其他JavaScript高阶技巧,成为专业的前端开发者!

?

文章来源:https://blog.csdn.net/qq_41152573/article/details/135530153
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。