js重写new方法

本文探讨了如何通过自定义new方法来控制对象实例化过程,重点介绍了如何指定原型、改变this指向以及判断返回值类型。实例化Father类并使用自定义new方法创建对象,同时展示了箭头函数和ES6简化语法在new操作中的限制。
摘要由CSDN通过智能技术生成
 function Father(name,age){
        this.name = name;
        this.age = function(){
            console.log(`我今年${age}岁了`);
            return age
        }
    }
    Father.prototype.job = 'cfo'
    
    //我们通过实例化对象new出来
    let son = new Father();
 
//有括号和没括号的区别有括号是可以进行传参的,但是也是可以进行new的
//通过new 我们可以思考下什么函数是不可以进行new的? 函数new的过程这个到底做了什么事情?
//总结来讲1 箭头函数是不可以进行new的。() => {} 2在一个就是ES6的简便语法是不可以new的   
// function Simple(){
//     name;
//     age;
// }
// let s = new Simple();
// console.log(s.name);
//ReferenceError: age is not defined 所以会报错

所以我们通过构造函数new的过程来自己写一个new的方法
1给方法指定原函数的的原型对象
2改变this的指向
3判断构造函数,返回值是基本值,还是对象,基础值返回构造函数本身,返回值是对象则返回该对象

 //判断数据类型是否是对象
 function isObject(obj) {
        let type = typeof obj;
        return (type != null && (type === 'Object' || type === 'function'))
    }
    const start = function (Ctor, ...argu) {
        //1让函数指向构造函数的原型
        let obj = {};
        obj.__proto__= Ctor.prototype
        //2改变this的指向,得到函数执行的返回值,
        let result = Ctor.call(obj, ...argu)//这个是call执行返回值 就是函数执行返回值  
        //3判断是否是对象
        if (isObject(result)) return result //这里为什么要返回result  
        return obj
    }
    let end = start(Father, 'fun', 23)
    console.log(end instanceof Father);//true
    console.log(end.name); //fun
    console.log(end.age());//我今年23了 23

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值