iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScriptbind函数手写教程
  • 930
分享到

JavaScriptbind函数手写教程

JavaScriptbind函数JSbind函数 2022-12-19 12:12:18 930人浏览 泡泡鱼
摘要

目录手写bind vs 原生bind规范中的bind小结经常会看到网上各种手写bind的教程,下面是我在自己实现手写bind的过程中遇到的问题与思考。如果对于如何实现一个手写bind

经常会看到网上各种手写bind的教程,下面是我在自己实现手写bind的过程中遇到的问题与思考。如果对于如何实现一个手写bind还有疑惑的话,那么可以先看看上面两篇文章。

手写bind vs 原生bind

我们先使用一个典型的手写bind的例子,代码如下:

Function.prototype.bind2 = function (context) {
    if (typeof this !== "function") {
      throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
    }
    var self = this;
    var args = Array.prototype.slice.call(arguments, 1);
    var fNOP = function () {};
    var fBound = function () {
        var bindArgs = Array.prototype.slice.call(arguments);
        return self.apply(this instanceof fNOP ? this : context, args.concat(bindArgs));
    }
    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();
    return fBound;
}

我们首先用原生bind运行一下代码

function Foo(a) {this.a = a}
Foo.prototype.sayHi = function( ) {}
let _Foo = Foo.bind(undefined, 'a')
new _Foo() 

更多面试题解答参见前端手写面试题详细解答

然后使用手写版代码,运行同样的代码

function Foo(a) {this.a = a}
Foo.prototype.sayHi = function( ) {}
let _Foo = Foo.bind2(undefined, 'a')
new _Foo() 

我们可以看到相比原生bind方法,手写版的bind方法返回的构造函数,构造出来的新对象会比原生的多一层__proto__。而这个__proto__产生的原因就是在很多教程中提到的防止原型链篡改。

这也就是为什么很多的文章会告诉你,为什么要添加下面的代码。

var fNOP = function () {};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();

这段代码中,使用了一个空函数作为中转,相当于Object.create(fBound.prototype)。具体可以查看文章开头给出的文章,里面的详细的说明。

规范中的bind

既然说道,加上面的代码是为了防止原型链篡改。我就想看看原生的bind如何处理这个问题的呢?

function Foo(a) {this.a = a}
Foo.prototype.sayHi = function( ) {}
let _Foo = Foo.bind(undefined, 'a')
_Foo.prototype.sayHi = function( ) {console.log('篡改的_Foo的sayHi方法')}
(new _Foo().sayHi())

我发现在运行上面的代码,程序执行到修改_Foo的原型方法的语句时,就已经报错了。提示表明_Foo没有prototype属性!既然没有prototype属性,那么是不是也就不用处理原型链篡改的问题了呢?

之后,我查了一下规范, 在NOTE中,有下面一段话。明确指出了bind返回的函数是没有prototype属性,这也多少印证了上面的猜想。

Function objects created using Function.prototype.bind do not have a prototype property or the [[Code]], [[FORMalParameters]], and [[Scope]] internal properties.

其中需要注意的有一点是这条:

Set the [[Prototype]] internal property of F to the standard built-in Function prototype object as specified in 15.3.3.1.

我自己理解的意思是是bind出来的函数对象的prototype属性是内建的Function.prototype属性, 这里应该是说明了为什么原生的bind不会多一层__proto__属性

小结

写这篇的目的是总结下自己在实现bind过程中遇到的问题,记录探究的过程。通过一系列手写原生方法,锻炼了我们对于原理的进一步认识。但是也要注意验证,实际去操作几次,可能得出自己的经验。如果有更多的两者对比的发现,可以在评论里告诉我,欢迎各位大佬斧正。

到此这篇关于javascript bind函数手写教程的文章就介绍到这了,更多相关js bind函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScriptbind函数手写教程

本文链接: https://www.lsjlt.com/news/175241.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScriptbind函数手写教程
    目录手写bind vs 原生bind规范中的bind小结经常会看到网上各种手写bind的教程,下面是我在自己实现手写bind的过程中遇到的问题与思考。如果对于如何实现一个手写bind...
    99+
    2022-12-19
    JavaScript bind函数 JS bind函数
  • chatGPT教我写compose函数的详细过程
    目录0 前言1 结果2 chatGPT过程概略3 最后0 前言 昨天希望实现一个通用的compose函数,能够接受同步函数与异步函数,并且通过异步函数同步执行来是吸纳compose函...
    99+
    2023-02-23
    chatGPT写compose函数 chatGPT compose函数
  • 手写vite插件教程示例
    目录前言1. 什么是 vite 插件2. 为什么要写 vite 插件创建  vite 插件通用模板1. 初始化2. 配置 eslint 和 prettier(可选)3. 新...
    99+
    2024-04-02
  • PHP函数开发技术教程:如何写出高质量的函数?
    在PHP开发过程中,函数是一个非常重要的部分。函数能够将代码分离出来,使得代码更加可读和可维护。同时,高质量的函数也能够提高代码的效率和安全性。 本文将分享一些PHP函数开发技巧,帮助你写出高质量的函数。 一、函数命名 函数命名应该简洁明...
    99+
    2023-08-09
    开发技术 教程 函数
  • 手写Spirit防抖函数underscore和节流函数lodash
    目录前言防抖函数和节流函数的区别防抖函数的实现基本实现立即执行取消功能返回结果节流函数的实现基本实现leading实现trailing实现取消功能和返回结果前言 防抖函数和节流函数,...
    99+
    2024-04-02
  • JS中callapplybind函数手写实现demo
    目录正文call 方法apply 方法bind 方法总结正文 JavaScript 中的函数是一等公民,可以像普通变量一样被传递和使用。这种灵活性使得函数可以被用于各种场景,比如对...
    99+
    2023-03-15
    JS call apply bind函数 JS 手写函数
  • pytorch教程实现mnist手写数字识别代码示例
    目录1.构建网络2.编写训练代码3.编写测试代码4.指导程序train和test5.完整代码 1.构建网络 nn.Moudle是pytorch官方指定的编写Net模块,在init函数...
    99+
    2024-04-02
  • PyTorch实现手写数字的识别入门小白教程
    目录手写数字识别(小白入门)1.数据预处理2.训练模型3.测试模型,保存4.调用模型5.完整代码手写数字识别(小白入门) 今早刚刚上了节实验课,关于逻辑回归,所以手有点刺挠就想发个博...
    99+
    2024-04-02
  • TensorFlow教程Softmax逻辑回归识别手写数字MNIST数据集
    基于MNIST数据集的逻辑回归模型做十分类任务 没有隐含层的Softmax Regression只能直接从图像的像素点推断是哪个数字,而没有特征抽象的过程。多层神经网络依靠隐含层,则...
    99+
    2024-04-02
  • Linux | 手把手教你写一个进度条小程序
    文章目录 一、前言二、理解 '\r' 与 '\n'1、可显字符与控制字符2、老式键盘 三、缓冲区的概念理解1、五个代码段 + 现象分析2、观察现象,提出问题❓3、行缓冲的概念 + 疑难解...
    99+
    2023-08-31
    linux 运维 服务器
  • 手把手教你写--FTP(基于python)
    ftp需求分析1. 多用户同时登陆(客户端合法性验证)2. 用户登陆,加密认证--(hamc or md5)3. 注册功能4. 上传/下载文件,保证文件一致性5. 不同用户家目录不同,且只能访问自己的家目录6. 对用户进行磁盘配额、不同用户...
    99+
    2023-01-30
    手把手教你 FTP python
  • PHP 函数使用教程
    php 函数允许将代码模块化,方便重用。要创建函数,使用 function 关键字,指定函数名、参数和函数体。要调用函数,使用其名称和参数。函数可以接受参数并返回一个值。在函数内部声明的...
    99+
    2024-04-10
    函数 php 作用域
  • Pythoninput()函数案例教程
    目录Python input()函数Python input()函数教程Python input()函数详解语法参数返回值案例输入字符串输入整数输入浮点数Python input()...
    99+
    2023-01-11
    Python input()函数 Python input()函数详解
  • c#线程函数怎么写
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • 手把手教你用Vue3写播放器
    TODO实现播放/暂停;实现开始/结束时间及开始时间和滚动条动态跟随播放动态变化;实现点击进度条跳转指定播放位置;实现点击圆点拖拽滚动条。页面布局及 css 样式如下<template> <div class=&quo...
    99+
    2023-05-14
    vue3
  • 手把手教你拿捏vue cale()计算函数使用
    目录前言cale()是什么基本使用灵活使用注意兼容性结尾前言 最近项目中遇到calc()方法不生效问题,本着究其所以然的想法,彻底查了一下calc的方法及使用,还有为什么项目中使用...
    99+
    2023-05-14
    vue cale()计算函数 vue cale
  • JavaScript手写源码之omit函数的实现
    目录添加测试文件实现omit函数最近突然有个新的想法,想去看看前端的小库来提升自己的编码能力。但是又不知道怎么去证明自己是否真的看懂了,那就实现一个mini的吧。 添加测试文件 我们...
    99+
    2023-02-09
    JavaScript实现omit函数 JavaScript omit函数 JavaScript omit
  • 无涯教程-PHP - preg_grep()函数
    preg_grep() - 语法 array preg_grep ( string $pattern, array $input [, int $flags] ); 返回由与给定模式匹配的输入数组元素组成的数组。 如果将flag设置为PRE...
    99+
    2023-09-05
    php
  • JavaScript函数的使用教程
    目录一、什么是JS的函数二、js函数的定义和调用三、js函数的参数传递和返回值1.参数传递2.返回值一、什么是JS的函数 JavaScript函数类似于java中的方法。 JS中也可...
    99+
    2024-04-02
  • 无涯教程-PHP - sql_regcase()函数
    sql_regcase() - 语法 string sql_regcase (string string) 可以将sql_regcase()函数视为实用程序函数,它将输入参数字符串中的每个字符转换为包含两个字符的带括号的表达式。 sql_r...
    99+
    2023-09-07
    php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作