位置: IT常识 - 正文

【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind(javascript中文手册)

编辑:rootadmin
【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind

推荐整理分享【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind(javascript中文手册),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript手机app,javascript手册安卓版,javascript手册安卓版,手机里javascript有什么用,javascript手机app,javascript手机编程,javascript手机app,javascript手机版,内容如对您有帮助,希望把文章链接给更多的朋友!

🖥️ NodeJS专栏:Node.js从入门到精通 🖥️ 博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述) 🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结) 🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬 👉 你的一键三连是我更新的最大动力❤️! 🏆分享博主自用牛客网🏆:一个非常全面的面试刷题求职网站,点击跳转🍬

文章目录前言1、手写Object.create要求手撕代码2、手写Function.call要求手撕代码3、手写Function.bind要求手撕代码结语前言

向大家推荐一款博主一直在用的面试刷题求职网站:牛客网

牛客网不仅具有公司真题、专项练习、面试题库、在线编程等功能,还具有非常强大的AI模拟面试功能,简直是求职者的福音!

牛客网里的题库非常全面的,无论你是前端还是后端,是想要备考还是准备面试又或者是想要提高自己,你都能在牛客网上找到适合自己的题,赶快点击链接去注册登录吧:点击进入牛客网

牛客网牛客网

本篇文章所有示例参考自牛客网题库/在线编程/JS篇。

1、手写Object.create要求

补全JavaScript代码,要求实现Object.create函数的功能且该新函数命名为"_objectCreate"。

Object.create函数介绍如下:

Object.create() 方法用于创建一个新对象,使用现有的对象来作为新创建对象的原型(prototype)。

Object.create 参数:

proto 新创建对象的原型对象。

propertiesObject (可选) 如果该参数被指定且不为 undefined,则该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。这些属性对应于 Object.defineProperties() 的第二个参数。

Object.defineProperties()方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。

Object.create 返回值:一个新对象,带着指定的原型对象及其属性。

手撕代码const _objectCreate = function (proto, propertiesObject) { // 补全代码 if (typeof proto !== 'object' || proto === null) { throw new TypeError('Object prototype may only be an Object or null') } // 定义新对象 const obj = {} // 设置原型 // obj.__proto__ = proto // 不建议这么做了 // 通常,应该使用 Object.setPrototypeOf() 方法来设置对象的原型。 // 因为 Object.prototype.__proto__ 访问器已被弃用。 Object.setPrototypeOf(obj, proto) // 建议使用setPrototypeOf设置原型 if (propertiesObject && propertiesObject !== 'undefined') { // 设置属性 Object.defineProperties(obj, propertiesObject) } return obj}

注意:通过__proto__设置原型的方法(obj.__proto__ = proto)已经不在标准中了!

测试一下:

let o = { a: 1 }let b = _objectCreate(o, { 'property1': { value: true, writable: true }, 'property2': { value: 'Hello', writable: false }})let c = Object.create(o, { 'property1': { value: true, writable: true }, 'property2': { value: 'Hello', writable: false }})console.log('使用_objectCreate创建的:', b);console.log('使用create创建的:', c);

2、手写Function.call要求

补全JavaScript代码,要求实现Function.call函数的功能且该新函数命名为"_call"。

Function.call()函数介绍如下:

【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind(javascript中文手册)

call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

Function.call 参数:

thisArg 可选的。在 function 函数运行时使用的 this 值。请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。

arg1, arg2, ... 指定的参数列表。

Function.call返回值:

使用调用者提供的 this 值和参数调用该函数的返回值。若该方法没有返回值,则返回 undefined。

手撕代码// target参数默认为windowFunction.prototype._call = function (target = window, ...arg) { // target是一个对象,这里的this就是调用_call方法的函数(母函数) // 我们需要实现的是将母函数的this指向到target,那么就可以: // 将母函数绑定到target的fn属性上,这样调用target.fn时它的this就指向了target target.fn = this; // 获取函数运行结果 const result = target.fn(...arg); // 再将target上的fn属性删除 delete target.fn return result}

测试一下:

function fn(a, b) { return this.name + a + b}let obj = { name: 'Ailjx' }console.log(fn.call(obj, 'S', "R"));console.log(fn._call(obj, 'S', "R"));

3、手写Function.bind要求

补全JavaScript代码,要求实现Function.bind函数的功能且该新函数命名为"_bind"。

Function.bind()函数介绍如下:

Function.bind()函数与Function.call()函数类似,区别就是Function.bind()返回的是一个修改过this指向的新函数,而不是函数执行后的值。

bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的初始参数,供调用时使用。

Function.bind 参数:

thisArg 调用绑定函数时作为 this 参数传递给目标函数的值。如果使用new运算符构造绑定函数,则忽略该值。当使用 bind 在 setTimeout 中创建一个函数(作为回调提供)时,作为 thisArg 传递的任何原始值都将转换为 object。如果 bind 函数的参数列表为空,或者thisArg是null或undefined,执行作用域的 this 将被视为新函数的 thisArg。

arg1, arg2, ... 当目标函数被调用时,被预置入绑定函数的参数列表中的参数。

Function.bind返回值:

返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。

手撕代码Function.prototype._bind = function (target = window, ...arg) { const fn = this; return function (...rest) { return fn.call(target, ...arg, ...rest); };};

测试一下:

function fn(a, b) { return this.name + a + b;}let obj = { name: "Ailjx" };// bind的第二个参数和返回的函数的参数会合并到一起console.log(fn.bind(obj, "S")("R"));// 以下两种写法与上面相等// console.log(fn.bind(obj, "S", "R")());// console.log(fn.bind(obj)("S", "R"));console.log(fn._bind(obj, "S")("R"));// console.log(fn._bind(obj, "S", "R")());// console.log(fn._bind(obj)("S", "R"));

结语

这篇文章的所有内容都出自于牛客网的JS篇题库:

牛客网的JS题库非常贴合实际的,在写的过程查漏补缺能收获了很多,强烈将牛客网推荐给大家!

如果本篇文章对你有所帮助,还请客官一件四连!❤️

基础不牢,地动山摇! 快来和博主一起来牛客网刷题巩固基础知识吧!

本文链接地址:https://www.jiuchutong.com/zhishi/299155.html 转载请保留说明!

上一篇:FormData详解(formdata方法)

下一篇:使用element-ui中的el-upload自定义上传(elemental ui)

  • vue main.js(vue main.js app.vue)

    vue main.js(vue main.js app.vue)

  • 爱奇艺一起看需要两个人都是会员吗(爱奇艺一起看需要)

    爱奇艺一起看需要两个人都是会员吗(爱奇艺一起看需要)

  • vivo手机安全模式怎么打开(vivo手机安全模式是怎么触发的)

    vivo手机安全模式怎么打开(vivo手机安全模式是怎么触发的)

  • 华为微信拍一拍怎么设置(华为微信拍一拍没有震动)

    华为微信拍一拍怎么设置(华为微信拍一拍没有震动)

  • 苹果x手机屏幕亮度时亮时暗怎么办(苹果x手机屏幕拆卸视频教程)

    苹果x手机屏幕亮度时亮时暗怎么办(苹果x手机屏幕拆卸视频教程)

  • 美图秀秀手机上照片怎么加边框(美图秀秀手机上怎么修改数字)

    美图秀秀手机上照片怎么加边框(美图秀秀手机上怎么修改数字)

  • 微信删掉的人可以找回吗(微信删掉的人可以拉黑吗)

    微信删掉的人可以找回吗(微信删掉的人可以拉黑吗)

  • 荣耀lldal10是什么型号(荣耀dlial10是什么型号)

    荣耀lldal10是什么型号(荣耀dlial10是什么型号)

  • wpa2密码是什么意思(WPA2密码是什么)

    wpa2密码是什么意思(WPA2密码是什么)

  • 抖音点赞限制数量(抖音点赞限量怎么办)

    抖音点赞限制数量(抖音点赞限量怎么办)

  • 手机能播放TF片吗(手机能播flv吗)

    手机能播放TF片吗(手机能播flv吗)

  • 11和11pro有什么区别(11跟11pro那个好用)

    11和11pro有什么区别(11跟11pro那个好用)

  • 苹果微信电话不弹出(苹果微信电话不响铃怎么回事)

    苹果微信电话不弹出(苹果微信电话不响铃怎么回事)

  • 微信第二次限制封几天(微信第二次限制申诉有用吗)

    微信第二次限制封几天(微信第二次限制申诉有用吗)

  • 喜马拉雅有电脑版吗(喜马拉雅有电脑客户端吗)

    喜马拉雅有电脑版吗(喜马拉雅有电脑客户端吗)

  • 华为荣耀20s带nfc不(华为荣耀20S带红外遥控吗)

    华为荣耀20s带nfc不(华为荣耀20S带红外遥控吗)

  • 华为怎么触屏唤醒(华为怎么触摸唤醒)

    华为怎么触屏唤醒(华为怎么触摸唤醒)

  • 华为mate30pro有实体音量键吗(华为mate30pro的)

    华为mate30pro有实体音量键吗(华为mate30pro的)

  • 手机爱奇艺怎么调清晰度(手机爱奇艺怎么出示二维码让别人登录)

    手机爱奇艺怎么调清晰度(手机爱奇艺怎么出示二维码让别人登录)

  • 2人共享位置时对方不动(2人共享位置时自己没有动,位置为什么会动)

    2人共享位置时对方不动(2人共享位置时自己没有动,位置为什么会动)

  • 火车票侯补下单什么意思(火车票候补订单多长时间可以兑现)

    火车票侯补下单什么意思(火车票候补订单多长时间可以兑现)

  • 苹果11有没有快充(苹果11有没有快充充电器)

    苹果11有没有快充(苹果11有没有快充充电器)

  • pdf怎么编辑文字内容(福昕pdf怎么编辑文字)

    pdf怎么编辑文字内容(福昕pdf怎么编辑文字)

  • pencil怎么激活(pencil2怎么激活)

    pencil怎么激活(pencil2怎么激活)

  • iphone7p授权怎么打开(苹果7plus授权在哪里)

    iphone7p授权怎么打开(苹果7plus授权在哪里)

  • word如何打竖排字(word里怎么打竖排字)

    word如何打竖排字(word里怎么打竖排字)

  • 2244*1080是几寸(2244x1080是多少英寸)

    2244*1080是几寸(2244x1080是多少英寸)

  • 如何手机上打出空格(如何手机上打出角度的符号呢)

    如何手机上打出空格(如何手机上打出角度的符号呢)

  • 快手直播瘦脸功能在哪里(快手直播瘦脸功能怎么开)

    快手直播瘦脸功能在哪里(快手直播瘦脸功能怎么开)

  • 外卖小程序应该怎么开发(外卖小程序应该做什么)

    外卖小程序应该怎么开发(外卖小程序应该做什么)

  • 手机语言设置在哪里(手机里的语言设置)

    手机语言设置在哪里(手机里的语言设置)

  • 电脑右击没有属性(电脑右击没有属性怎么办)

    电脑右击没有属性(电脑右击没有属性怎么办)

  • 微信小程序使用 npm 包,举例图文详解(微信小程序使用时间记录查询)

    微信小程序使用 npm 包,举例图文详解(微信小程序使用时间记录查询)

  • emacs基础  csqlwy  博客园(emacs scheme)

    emacs基础 csqlwy 博客园(emacs scheme)

  • 公司税后利润怎么算
  • 19年房产税新规
  • 科技公司的成本如何核算
  • 适用会计制度备注怎么填?
  • 税收优惠有哪些类型
  • 报销餐费有增值税吗
  • 生产车间的房屋要交税吗
  • 办公室购置空调的词语
  • 其他服务业经营范围包括哪些
  • 跨月冲红的发票怎么做账
  • 小企业 企业所得税
  • 理财产品取得收益要交税吗
  • 应税货物销售额怎么计算
  • 成品油发票应该怎么冲红?
  • 增值税价外费用不包括
  • 常用的索赔费用计算方法
  • 1697506708
  • 汽车租凭发票税率
  • 抵押贷款逾期怎么处理抵押物
  • iphone6按键功能介绍
  • 新手会计入门
  • 局域网文件共享不稳定
  • 腾讯电脑管家开机加速在哪里
  • mac版本系统
  • 税前净利润等于什么
  • 水利基金返还分录怎么写
  • 电脑bios怎么设置网络启动
  • neoCopy.exe - neoCopy是什么进程 有什么用
  • 图文详解:台盆柜安装的全过程
  • vue前端开发规范
  • 单位房转卖
  • phpunicode
  • 总分机构分摊比例如何确定
  • php批量处理数据
  • vue created mounted
  • deepwiser怎么用
  • wordpress转化为html
  • vue3 script setup withdefault
  • 应付利息和利息支出什么时候用
  • 修的公路是否上固定资产
  • 在税务局怎么查补缴的社保
  • 短期投资的入账成本
  • 织梦tag标签怎么用
  • 给客户的现金奖励会计处理
  • 受托机构名称填什么
  • 工资结算汇总表怎么填
  • 企业购房如何入账
  • access参数查询怎么弄
  • 关税完税价格计算增值税
  • 公司债券分为
  • 业务招待费专用会计科目
  • 审计如何判断跨期
  • 企业租入设备的会计分录怎么写
  • 购入固定资产的会计科目
  • 非正常损失的进项税额转出会计分录
  • 对公账户没有用了一定要注销吗?
  • 实收资本认缴怎么做账,要做账吗
  • 电子承兑汇票如何入账
  • MySQL replace into 语句浅析(二)
  • sql返回一条数据
  • redhat配置bond
  • 微软edge浏览器在哪
  • window10预览在哪里找
  • windowsxp休眠设置
  • win10无人值守文件使用方法
  • xp系统1
  • nginx文件服务器
  • 计算机策略设置
  • win7系统笔记本怎么连接wifi
  • flash插件app
  • jquery虚拟dom
  • html文件怎么用ie浏览器打开
  • js设计原则
  • unity c语言
  • javascript获取html元素的方法
  • js中定义对象
  • flask框架下使用scrapy框架
  • 如何缴纳地税工伤保险
  • 日本快递税率
  • 超市一般纳税人做账流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设