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日

相关文章

  • python selenium操作cookie的实现

    Python Selenium操作Cookie的实现: 引入selenium模块 from selenium import webdriver 定义浏览器对象 browser = webdriver.Chrome() 获取网站Cookie信息 browser.get(‘https://www.baidu.com’) print(browser.get_coo…

    JavaScript 2023年6月11日
    00
  • Web前端开发规范2017(HTML/JavaScript/CSS)

    Web前端开发规范旨在规范前端开发,提高代码质量,增强代码可读性和可维护性。本文将详细讲解“Web前端开发规范2017(HTML/JavaScript/CSS)”的完整攻略。 HTML规范 DOCTYPE 统一使用HTML5标准的文档类型声明: <!DOCTYPE html> <html> … </html> 编码 使…

    JavaScript 2023年5月19日
    00
  • JavaScript Generator函数使用分析

    JavaScript Generator函数使用分析 什么是Generator函数 Generator函数是ES6引入的一种新的函数类型,与普通的函数不同之处在于它能够被暂停和恢复。在调用Generator函数时,不会立即执行函数内部的代码,而是返回一个迭代器对象,通过调用迭代器对象的next()方法,才会执行函数内部的代码,执行到关键字yield时函数暂停…

    JavaScript 2023年5月28日
    00
  • Javascript中关于Array.filter()的妙用详解

    当我们需要对一个数组进行筛选操作时,通常会使用Array.filter()方法。该方法接受一个函数作为参数,用于对数组进行筛选并返回满足条件的数组元素。下面是一个基本的示例: const numbers = [1, 2, 3, 4, 5]; const evenNumbers = numbers.filter(num => num % 2 === 0)…

    JavaScript 2023年5月28日
    00
  • JS Loading功能的简单实现

    下面是详细讲解“JS Loading功能的简单实现”的完整攻略。 什么是JS Loading功能? JS Loading功能是指在网页中通过异步加载JavaScript文件,避免了网页在加载JavaScript资源时阻塞其他资源,提高了网页的响应速度和用户体验。 如何实现JS Loading功能? 在实现JS Loading功能时,可以采用如下的步骤: 创建…

    JavaScript 2023年6月11日
    00
  • js实现时间轴自动排列效果

    下面我将详细讲解如何使用JavaScript实现时间轴自动排列效果。 概述 时间轴是一种将时间点或事件与轴上的点或线连接起来的可视化工具,被广泛应用于各个网站的设计中。自动排列效果指的是时间轴上的点或线可以自动按照时间顺序排列显示。下面我们将分步骤详细介绍如何使用JavaScript实现这个效果。 步骤 1. 准备数据 首先需要准备一个包含时间信息的数据,通…

    JavaScript 2023年5月27日
    00
  • JS脚本实现网页自动秒杀点击

    让我对“JS脚本实现网页自动秒杀点击”的攻略给出一个完整的讲解吧。整个过程分为以下几个步骤: 第一步:分析网页结构和页面元素 在使用JS脚本实现自动秒杀之前,首先需要分析待秒杀页面的HTML结构和页面元素,确定需要点击的按钮(或链接)的CSS选择器,才能在JS中进行操作。 例如,假设要开发一个自动抢购京东上某一个商品的脚本,我们需要进入该商品页面,打开浏览器…

    JavaScript 2023年6月11日
    00
  • JavaScript编程中window的location与history对象详解

    JavaScript编程中window的location与history对象详解 在JavaScript编程中,window对象是一个非常重要的对象,它是代表当前浏览器窗口的一个全局对象。其中,window对象的location属性和history属性也是常用的对象,本文将详细讲解这两个对象的用法和特点。 location对象 location对象代表当前浏…

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