位置: 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)

  • morphvox pro参数(morphvox pro怎么用)(morphvox pro手机可以用吗)

    morphvox pro参数(morphvox pro怎么用)(morphvox pro手机可以用吗)

  • 零钱通怎么隐藏钱包金额(零钱通怎么隐藏让别人看不到)

    零钱通怎么隐藏钱包金额(零钱通怎么隐藏让别人看不到)

  • ipx4级防水是指什么(ip4x防水等级是什么)

    ipx4级防水是指什么(ip4x防水等级是什么)

  • 电脑外置摄像头模糊怎么办(台式电脑外置摄像头)

    电脑外置摄像头模糊怎么办(台式电脑外置摄像头)

  • 坚果pro3屏幕变黑白了怎么办(坚果Pro3屏幕变绿)

    坚果pro3屏幕变黑白了怎么办(坚果Pro3屏幕变绿)

  • 腾讯会议录音在哪?(腾讯会议录音在哪里关闭)

    腾讯会议录音在哪?(腾讯会议录音在哪里关闭)

  • pdf扫描版是什么意思(pdf格式扫描版是怎么做的)

    pdf扫描版是什么意思(pdf格式扫描版是怎么做的)

  • 抖音蓝v可以取消吗(抖音蓝v可以取消吗钱退吗)

    抖音蓝v可以取消吗(抖音蓝v可以取消吗钱退吗)

  • geforce和gtx的区别

    geforce和gtx的区别

  • 钉钉打卡时间能不能修改(钉钉打卡时间能看到秒吗?)

    钉钉打卡时间能不能修改(钉钉打卡时间能看到秒吗?)

  • 抖音不想让一个人看到怎么设置(抖音不想让一个人看到我在线)

    抖音不想让一个人看到怎么设置(抖音不想让一个人看到我在线)

  • vivox7可不可以快充(vivox7plus快充怎么设置)

    vivox7可不可以快充(vivox7plus快充怎么设置)

  • 抖音如何自己添加定位(抖音如何自己添加位置)

    抖音如何自己添加定位(抖音如何自己添加位置)

  • 腾讯视频怎么下载视频(腾讯视频怎么下载到u盘)

    腾讯视频怎么下载视频(腾讯视频怎么下载到u盘)

  • 淘宝预售定金能退吗(淘宝预售定金能退吗怎么退)

    淘宝预售定金能退吗(淘宝预售定金能退吗怎么退)

  • 添加sku会影响权重吗(添加sku会降权吗)

    添加sku会影响权重吗(添加sku会降权吗)

  • 谷歌服务框架安装失败怎么办(谷歌服务框架安装了谷歌商店还是闪退)

    谷歌服务框架安装失败怎么办(谷歌服务框架安装了谷歌商店还是闪退)

  • 抖音把对方移出粉丝对方知道吗(抖音把对方移出黑名单后对方有提示吗)

    抖音把对方移出粉丝对方知道吗(抖音把对方移出黑名单后对方有提示吗)

  • 手机微信空格怎么打(手机微信空格怎么删除)

    手机微信空格怎么打(手机微信空格怎么删除)

  • ps如何缩小图片内存

    ps如何缩小图片内存

  • switch主机模式怎么用

    switch主机模式怎么用

  • 苹果xr突然黑屏开不了机怎么回事(苹果xr突然黑屏但没关机)

    苹果xr突然黑屏开不了机怎么回事(苹果xr突然黑屏但没关机)

  • a1674是ipad几(a1674是ipad几代那年款)

    a1674是ipad几(a1674是ipad几代那年款)

  • cancel命令  取消已存在的打印任务(cancel怎么关)

    cancel命令 取消已存在的打印任务(cancel怎么关)

  • phpcms首页模板是哪个文件(phpcms 用的是什么模板引擎)

    phpcms首页模板是哪个文件(phpcms 用的是什么模板引擎)

  • 境外培训费计入关税完税价格
  • 发票冲红重开,重开时是按新税率还是旧税率
  • 血液制品3%增值税税率
  • 应收账款的账面价值和账面余额的区别
  • 差旅费报销单是外来原始凭证吗
  • 外贸企业当月没交税
  • 可供出售权益工具投资公允价值的增加
  • 房地产开发企业会计科目
  • 客户退货的会计分录
  • 开发间接费什么时候计提
  • 所得税弥补以前的利润
  • 先进制造业企业按照当期可抵扣进项税额
  • 在建工程当中哪些是资产
  • 本月完工产品的会计分录
  • 丢失增值税专用发票
  • 全额抵扣有哪些
  • 营改增的重点是什么
  • 关于个人财产转让的规定
  • 收汇结汇的账务处理
  • 过路费发票可以抵扣增值税吗
  • 其他综合收益是什么类科目
  • 列入工资的补贴是什么
  • 企业劳务外包取费的标准以及依据是什么?
  • 发票额度1万申请10万的条件
  • 赠与房产再出售税费
  • 存货清查的账务处理的阐述
  • 固定资产处置要交所得税吗
  • 无法删除文件提示怎么办
  • 质押已至票据到期日
  • 以房抵工程款会计分录
  • winds10教育版
  • php语言之面向对象编程 educoder
  • win11怎么打开磁盘管理
  • Cpqset.exe是什么系统进程 Cpqset有啥作用
  • 怎么开通公众号微信公众平台
  • 员工的生活费会不会扣个税
  • 货运代理开票
  • phpexcel插件
  • 营改增后如何纳税
  • wordpresscom
  • 搬迁补偿费属于什么费
  • css案例教程
  • 异地工程款预缴
  • 季度申报残保金怎么计算
  • flink从入门到实战
  • js遇到的问题
  • 保证增信是什么意思东奥2023
  • 培训机构给学员过生日文案
  • 公司赠送客户的产品怎么核算
  • java基础运算符有哪些
  • 普通的增值税
  • 企业所得税的营业收入包括营业外收入吗
  • 金蝶固定资产折旧调整
  • 废品材料回收的会计分录
  • 小规模纳税人转一般纳税人当月如何申报
  • 装载机如何计提折旧费用
  • 避税唯一安全的方法
  • 老板想提取销售怎么办
  • 固定资产清理的税率是多少
  • 退货会计如何处理
  • 会计记账凭证怎么装订视频
  • 建账的基本要求
  • 施工企业应收账款周转率多少合适
  • mysql 更改密码
  • freebsd软件安装
  • vmware安装centos7超详细过程 图文
  • win7系统安装无法继续怎么办
  • win8的系统
  • ubuntu10.04 root的帐户启用方法
  • win8系统如何关闭杀毒系统
  • linux中rename命令详解
  • c++ nops
  • Python编程给定a=1,b=4,输出a+b的值
  • js 仿真
  • 瀑布流软件
  • 德州市税务局领导
  • 天津国税局电子税务局
  • 中国移动的电子协议推送服务是什么
  • 福建地方税务局历任 李
  • 珠海的教育水平在全省的排名
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设