JS面试必备之手写call/apply/bind/new

以下是关于“JS面试必备之手写call/apply/bind/new”的完整攻略。

手写call和apply

call和apply是JavaScript原生的方法,可以改变函数的this指向。下面是手写实现call和apply的步骤:

call

  1. 将函数作为对象的一个属性。
  2. 将函数的this指向当前对象。
  3. 执行该函数。
  4. 将对象上的函数删除。
Function.prototype.myCall = function (context = window, ...args) {
  let fn = Symbol();
  context[fn] = this;
  let result = context[fn](...args);
  delete context[fn];
  return result;
}

apply

  1. 将函数作为对象的一个属性。
  2. 将函数的this指向当前对象。
  3. 执行该函数。
  4. 将对象上的函数删除。
Function.prototype.myApply = function (context = window, args) {
  let fn = Symbol();
  context[fn] = this;
  let result = context[fn](...args);
  delete context[fn];
  return result;
}

代码中的context是传入的上下文对象,如果不传入则默认为window。

示例:

let obj = {
  name: '小明'
}

function sayHi(age, gender) {
  console.log(`我叫${this.name},我今年${age}岁了,我是${gender}。`);
}

sayHi.myCall(obj, 18, '男'); // 我叫小明,我今年18岁了,我是男。
sayHi.myApply(obj, [18, '男']); // 我叫小明,我今年18岁了,我是男。

手写bind

bind方法可以创建一个新的函数,将原函数的this指向指定对象,并返回该新函数。下面是手写实现bind方法的步骤:

  1. 返回一个新函数。
  2. 将新函数的this指向传入的对象。
  3. 将新函数的参数传递给原函数。
  4. 如果新函数被实例化,需要将原函数的原型链赋值给新函数,以保证原函数的属性和方法可以被继承。
Function.prototype.myBind = function (context = window, ...args) {
  let self = this;
  return function (...newArgs) {
    if (this instanceof self) {
      self.apply(this, [...args, ...newArgs]);
    } else {
      context[self.name] = self;
      context[self.name](...args, ...newArgs);
      delete context[self.name];
    }
  }
}

示例:

let obj1 = {
  name: '小明',
  sayHi(age) {
    console.log(`我叫${this.name},我今年${age}岁了。`);
  }
}
let obj2 = {
  name: '小红'
}

let sayHi = obj1.sayHi.myBind(obj2, 18);

sayHi(); // 我叫小红,我今年18岁了。
let person = new sayHi(); // person.sayHi is not a function

手写new

new操作符主要实现以下几步操作:

  1. 创建一个新对象。
  2. 将该新对象的原型链指向构造函数的prototype。
  3. 将构造函数的this指向该新对象。
  4. 执行构造函数,获得返回值。
  5. 如果构造函数返回值为基本类型,则返回新创建的对象,否则返回构造函数的返回值。
function myNew() {
  let obj = new Object();
  let Constructor = [].shift.call(arguments);
  obj.__proto__ = Constructor.prototype;
  let result = Constructor.apply(obj, arguments);
  return typeof result === 'object' ? result || obj : obj;
}

示例:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.sayHi = function () {
  console.log(`我叫${this.name},我今年${this.age}岁了。`);
}

let person1 = myNew(Person, '小明', 18);
let person2 = new Person('小红', 19);

person1.sayHi(); // 我叫小明,我今年18岁了。
person2.sayHi(); // 我叫小红,我今年19岁了。

总结:通过手写call、apply、bind和new的实现,不仅可以帮助我们更好地理解和掌握这些方法的使用,同时也可以在面试中展示我们的js基础知识和编程技能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS面试必备之手写call/apply/bind/new - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • javascript实现倒计时小案例

    下面是“JavaScript实现倒计时小案例”的完整攻略。 1. 准备工作 在编写倒计时小案例之前,需要掌握 JavaScript 基础语法,包括函数、变量、条件语句、循环语句等。同时,还需要了解日期对象 Date。以及能够基本运用 DOM 操作。 为了更好地构建简单的页面结构,可以使用 html 和 css。 2. 分析需求 在实现倒计时小案例之前,了解并…

    JavaScript 2023年5月27日
    00
  • JavaScript封装的常用工具类库bee.js用法详解【经典类库】

    JavaScript封装的常用工具类库bee.js用法详解【经典类库】 1. 什么是bee.js bee.js是一款小而美的JavaScript工具类库,它提供了众多常用的功能函数,例如类型判断、DOM操作、数据结构等。它被设计成符合模块化开发思想,可以轻松集成到各种前端框架和项目中。 2. bee.js的安装和引入 你可以通过npm安装bee.js npm…

    JavaScript 2023年5月28日
    00
  • JS获取Table中td值的方法

    获取表格中单元格(td)的值是 JavaScript 中常见的操作之一,常用于数据整理和处理。下面我将为您详细讲解 JS 获取表格中 td 值的方法,整个攻略包括以下几个部分: 非固定表格的处理方法 固定表格处理方法 示例说明 1. 非固定表格的处理方法 对于非固定的表格(即行列数不确定),可以通过以下方法获取其中的单元格值: 首先,我们需要通过 docum…

    JavaScript 2023年6月10日
    00
  • ASP.NET 窗体间传值的方法

    ASP.NET是一种基于Web应用程序的框架,可以轻松实现Web开发,并提供了多种窗体间传值的方法。 一、Query String Query String是通过在URL上添加查询字符串的方法。例如,可以使用以下代码在源页面中将值传递到目标页面: string url = "targetPage.aspx?name=" + txtName…

    JavaScript 2023年6月11日
    00
  • javascript alert乱码的解决方法

    Javascript alert乱码的解决方法其实比较简单,主要就是需要提前设置网页的charset为UTF-8,接下来,我将详细说明如何进行解决,具体步骤如下: 设置charset为UTF-8 打开HTML文件或模板文件,添加以下代码到HTML文件头部,对于网站的每个页面都需要添加: <meta charset="UTF-8"&g…

    JavaScript 2023年5月19日
    00
  • 分享15个JavaScript的重要数组方法

    下面是详细讲解“分享15个JavaScript的重要数组方法”的完整攻略,具体分为以下几个部分: 1. 前言 数组是 JavaScript 中最常用的数据类型之一,常用于存储一系列的数据元素。在 JavaScript 中,数组提供了一系列强大的方法,帮助开发者更加高效地处理数据。下面将主要介绍 15 个 JavaScript 的重要数组方法。 2. Java…

    JavaScript 2023年5月18日
    00
  • 20个必会的JavaScript面试题(小结)

    下面是“20个必会的JavaScript面试题(小结)”的完整攻略: 1. 介绍JavaScript的数据类型 JavaScript有六种基本数据类型,分别是:数字(Number)、字符串(String)、布尔(Boolean)、null、undefined和对象(Object)。其中,对象又可以分为普通对象、函数、数组等多种类型。 2. 什么是闭包?如何使…

    JavaScript 2023年5月28日
    00
  • 果断收藏9个Javascript代码高亮脚本

    收藏Javascript代码高亮脚本的完整攻略 1. 搜索Github Github上有很多Javascript代码高亮插件,可以通过搜索Github来找到适合自己项目的插件。在Github的搜索框中输入”javascript highlight”,即可得到相关插件。 示例:Search Github Code Highlight 1. 打开Github网站…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部