JS原生方法(Object篇、Function篇)

在实际开发中,或许我们会使用很多JavaScript自带的方法,而且这些方法确实给我们带来了很多便利,大大提高了我们的代码小路,但是,有没有一瞬间,你想知道这些方法到底是怎么实现的呢?接下来我将用几篇博客来进行了解

通过这篇文章可以学到什么呢?

  1. 重新巩固对象与函数各种方法的使用方式
  2. 巩固基础,即便没有这些方法,也能靠基础语法去实现

定义一个测试对象[Object]

const obj = {
    name: '阿磊',
    age: 24,
    gender: '男'
}

Entries

用处:将对象转换为键值对数组。

Object.prototype.entries = function (obj) {
    const res = []
    for (let key in obj) {
        obj.hasOwnProperty(key) && res.push([key, obj[key]])
    }
    return res
}

console.log(Object.entries(obj))
// [ [ 'name', '阿磊' ], [ 'age', 24 ], [ 'gender', '男' ] ]

FromEntries

用处:跟 Entries 相反,将键值对数组转换为对象。

Object.prototype.fromEntries = function (arr) {
    const obj = {}
    for (let i = 0; i < arr.length; i++) {
        const [key, value] = arr[i]
        obj[key] = value
    }
    return obj
}

console.log(Object.fromEntries([['name', '阿磊'], ['age', 24], ['gender', '男']]))
// { name: '阿磊', age: 24, gender: '男' }

Keys

用处:将对象的 key 转换成一个数组合集。

Object.prototype.keys = function (obj) {
    const keys = []
    for (let key in obj) {
        obj.hasOwnProperty(key) && res.push(key)
    }
    return keys
}

console.log(Object.keys(obj))
// [ 'name', 'age', 'gender' ]

Values

用处:将对象的所有值转换成一个数组合集。

Object.prototype.values = function (obj) {
    const values = []
    for (let key in obj) {
        obj.hasOwnProperty(key) && values.push(obj[key])
    }
    return values
}

console.log(Object.values(obj))
// [ '阿磊', 24, '男' ]

InstanceOf

用处:A instanceOf B,判断A是否经过B的原型链。

function instanceOf(father, child) {
    const fp = father.prototype
    var cp = child.__proto__

    while (cp) {
        if (cp === fp) {
            return true
        }
        cp = cp.__proto__
    }

    return false
}

function Person(name) {
    this.name = name
}
const Alei = new Person('阿磊')

console.log(instanceOf(Person, Alei )) // true
console.log(instanceOf(Person, Alei2)) // false

Is

用处:Object(a,b),判断a是否等于b。

Object.prototype.is = function (x, y) {
    if (x === y) {
        // 防止 -0 和 +0
        return x !== 0 || 1 / x === 1 / y
    }

    // 防止NaN
    return x !== x && y !== y
}

const a = { name: '阿磊' }
const b = a
const c = { name: '阿磊' }

console.log(Object.is(a, b)) // true
console.log(Object.is(a, c)) // false

函数[Function]

Call

Function.prototype.call = function (obj, ...args) {
    obj = obj || window

    // Symbol是唯一的,防止重名key
    const fn = Symbol()
    obj[fn] = this

    // 执行,返回执行值
    return obj[fn](...args)
}

const testobj = {
    name: '阿磊',
    testFn(age) {
        console.log(`${this.name}${age}岁了`)
    }
}
const testobj2 = {
    name: 'Alei阿磊'
}

testobj.testFn.call(testobj2, 24) // Alei阿磊24岁了

Apply

Function.prototype.apply = function (obj, args) {
    obj = obj || window

    // Symbol是唯一的,防止重名key
    const fn = Symbol()
    obj[fn] = this

    // 执行,返回执行值
    return obj[fn](...args)
}

const testobj = {
    name: '阿磊',
    testFn(age) {
        console.log(`${this.name}${age}岁了`)
    }
}
const testobj2 = {
    name: 'Alei阿磊'
}

testobj.testFn.apply(testobj2, [24]) // Alei阿磊24岁了

JS原生其他方法

JS原生(数组篇)
JS原生(String篇、Promise篇)

结束语

如果你觉得此文对你有一丁点帮助,点个赞,鼓励一下阿磊哈哈。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值