【小白鲨笔记】js面试题(八)

18 篇文章 0 订阅

八、new操作符具体执行机制

  1. 创建了一个空的对象

    function fn(){}
    console.log(new fn()) //空对象fn
    
  2. 将空对象的原型,指向于构造函数的原型

    function fn(){}
    console.log(new fn().__proto__ == fn.prototype) //true -- 同一个原型
    
  3. 将空对象作为构造函数的上下文(改变this指向)

    funtion fn() {
        console.log(this)
        this.name = 'zs'
    }
    console.log(fn()) //this指向window,因此不存在name属性
    console.log(new fn()) //this指向fn对象,因此name属性是zs
    
  4. 对构造函数有返回值的处理判断:

    • 基本数据:忽视

    • 引用数据:覆盖当前对象

    function fn1() { return {} }
    function fn2() { return '01' }
    console.log(new fn1()) //返回:最后返回的对象,而不是fn对象
    console.log(new fn2()) //返回:不影响
    

模拟new过程

function A (age,name){
    this.age = age;
    this.name = name;
}
function create(fn, ...args){
    //1. 创建了一个空的对象
    var obj = {}; //var obj = Object.create({})
    //2. 将空对象的原型,指向于构造函数的原型
    Object.setPrototypeOf(obj,fn.prototype);
    //3. 将空对象作为构造函数的上下文(改变this指向)
    var result = fn.apply(obj,args);
    //4. 对构造函数有返回值的处理判断
    return result instanceof Object ? result : obj;
}
console.log(create(A, 18, 'jaws'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值