js基础

103 阅读1分钟

new

function my_new(func){
    // 1. 新建对象
    let obj = {}
    // 2. 修改原型链
    obj.__proto__ = func.prototype
    // 3.示例属性获取,并修改this
    func.call(obj)
    // 4.返回对象
    return obj
}

Object.create

function create(Obj){
    // 2. 新建构造函数
    function F() {}
    // 3. 原型链修改
    F.prototype = Obj
    // 4.新建对象
    return new F()
}

call和apply

Function.prototype._call = function (ctx) {
    // 1. 构造被调用对象,兼容默认值
    var obj = ctx || window
    // 2. 获取后续参数
    var args = Array.from(arguments).slice(1)
    // 3. 获取唯一属性名
    var fun = Symbol()
    // 4. 增加属性方法,指向待调用函数
    obj[fun] = this
    var result = obj[fun](...args)
    // 5. 执行完毕后,删除该属性
    delete obj[fun]
    return result
}

Function.prototype._apply = function (ctx) {
    var obj = ctx || window
    var args = Array.from(arguments).slice(1)
    var fun = Symbol()
    // 参数处理
    var result = obj[fun](args.join(','))
    delete obj[fun]
    return result
}

bind

Function.prototype._bind = function (ctx) {
    // 1. 兼容判断
    var ctx = ctx || window
    // 2. 保留当前获取参数
    var args = Array.from(arguments).slice(1)
    var _this = this
    // 3. 返回函数
    return function F(arguments) {
        // 4.判断是否new 场景
        if(this instanceof F){
            // 5. 此时直接执行构造函数
            return new _this(...args, ...arguments)
        }else{
            //   5. 常规场景,依然绑定this指向,拼接新增参数
            return _this.apply(ctx, args.concat(arguments))
        }
        
    }
}