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

这篇具有很好参考价值的文章主要介绍了【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


前言

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

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

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

牛客网 牛客网
前端面试笔试题手写手写 object.create,# JS题解,JavaScript,1024程序员节,javascript,面试,前端,算法 前端面试笔试题手写手写 object.create,# JS题解,JavaScript,1024程序员节,javascript,面试,前端,算法

本篇文章所有示例参考自牛客网题库/在线编程/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);

前端面试笔试题手写手写 object.create,# JS题解,JavaScript,1024程序员节,javascript,面试,前端,算法

2、手写Function.call

要求

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

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

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

Function.call 参数:

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

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

Function.call返回值:

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

手撕代码

// target参数默认为window
Function.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")); 

前端面试笔试题手写手写 object.create,# JS题解,JavaScript,1024程序员节,javascript,面试,前端,算法

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运算符构造绑定函数,则忽略该值。当使用 bindsetTimeout 中创建一个函数(作为回调提供)时,作为 thisArg 传递的任何原始值都将转换为 object。如果 bind 函数的参数列表为空,或者thisArgnullundefined,执行作用域的 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"));

前端面试笔试题手写手写 object.create,# JS题解,JavaScript,1024程序员节,javascript,面试,前端,算法

结语

这篇文章的所有内容都出自于牛客网的JS篇题库:
前端面试笔试题手写手写 object.create,# JS题解,JavaScript,1024程序员节,javascript,面试,前端,算法

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

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

基础不牢,地动山摇! 快来和博主一起来牛客网刷题巩固基础知识吧!文章来源地址https://www.toymoban.com/news/detail-831746.html

到了这里,关于【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【手撕面试题】JavaScript(高频知识点三)

    目录 面试官:什么是防抖和节流,他们的应用场景有哪些? 面试官:js中什么是可选操作符,如何访问数组? 面试官:请简述一下 event loop 面试官:请简述 node/v8 中的垃圾回收机制 面试官:如何删除项目中没有使用到的 package? 面试官:请你谈谈 js 中在 new 的时候发生了什么

    2023年04月08日
    浏览(45)
  • 前端面试手撕编程

    目录 获取DOM节点 document.getElementById/Name()document.getElementByClassName() document.getElementsByTagName() element.getElementsByTagName() element/document.querySelector()返回第一个 element/document.querySelectorAll()返回数组 布局 header,content,sider 三栏布局 :左右固定,中间自适应(⭐手写) flex布局(强烈推荐

    2024年02月11日
    浏览(37)
  • 【JavaScript】面试手写题精讲之数组(下)

    这章主要讲的是数组的排序篇,我们知道面试的时候,数组的排序是经常出现的题目。所以这块还是有必要进行一下讲解的。笔者观察了下前端这块的常用算法排序题,大概可以分为如下 冒泡排 – 稳定排序 插入排序 – 稳定排序 选择排序 – 不稳定排序 快速排序 – 不稳定

    2024年02月19日
    浏览(39)
  • 【JavaScript】面试手写题精讲之数组(中)

    续借上文,这篇文章主要讲的是 数组原型链 相关的考题,有些人可能会纳闷,数组和原型链之间有什么关系呢?我们日常使用的数组 forEach , map 等都是建立在原型链之上的。举个🌰,如我有一个数组 const arr = [1,2,3] 我想要调用 arr.sum 方法对 arr 数组的值进行求和,该如何做

    2024年02月21日
    浏览(38)
  • 经典JavaScript手写面试题和答案

    2024年02月06日
    浏览(61)
  • JavaScript 手撕大厂面试题数组扁平化以及增加版本 plus

    现在的前端面试手撕题是一个必要环节,有点时候八股回答的不错但是手撕题没写出来就会让面试官印象分大减,很可能就挂了… 数组的 扁平化 其实就是将一个多层嵌套的数组转换为只有一层的数组 比如: [1, [2, [3, [4, 5]]]] = [1,2,3,4,5,6] 一、实现一个 flat() easy 难度 二、用

    2024年02月14日
    浏览(35)
  • 【前端面试手撕题】事件委托、数组去重、合法URL、快速排序、全排列

    描述 请补全JavaScript代码,要求如下: 给\\\"ul\\\"标签添加点击事件 当点击某\\\"li\\\"标签时,该标签内容拼接\\\".“符号。如:某\\\"li\\\"标签被点击时,该标签内容为”…\\\" 注意: 必须使用DOM0级标准事件(onclick) 描述 请补全JavaScript代码,要求去除数组参数中的重复数字项并返回该数组。

    2024年02月14日
    浏览(41)
  • 前端面试问题-JavaScript

    1 闭包 闭包就是能够读取其他函数内部变量的函数 闭包是指有权访问另⼀个函数作⽤域中变量的函数,创建闭包的最常⻅的⽅式就是在⼀个函数内创建另⼀个函数,通过另⼀个函数访问这个函数的局部变量,利⽤闭包可以突破作⽤链域 闭包的特性: 函数内再嵌套函数 内部函

    2024年02月15日
    浏览(46)
  • 前端面试题---->JavaScript

    原因: 当使用const声明一个对象或数组时,实际上是保证了对象或数组的引用不会被修改,但对象或数组本身的属性或元素是可以被修改的。这是因为const只能保证指向的内存地址不变,但并不保证内存地址指向的内容不变,而基本类型的变量在内存中存储的是值本身,而不

    2024年03月27日
    浏览(53)
  • 前端JavaScript面试100问(上)

    闭包:就是能够读取外层函数内部变量的函数。 闭包需要满足三个条件: 访问所在作用域; 函数嵌套; 在所在作用域外被调用 。 优点: 可以重复使用变量,并且不会造成变量污染 。 缺点: 会引起内存泄漏 使用闭包的注意点: 由于闭包会使得函数中的变量都被保存在内

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包