JS深入基础之理解并原生实现new以及判断this

653 阅读1分钟

理解new

首先先补一张图,关于原型链的

avatar

new 关键字干了些什么呢

首先他创建了一个新的空对象,然后获取了传入的构造函数以及参数,再将新创建的空对象实例的__proto__属性指向了构造函数的prototype属性(也就是原型),然后新建一个变量,用apply方法把构造函数和参数绑定在新对象中的结果进行赋值。最后返回结果

function fakeNew() {
    var obj = Object.create(Object.prototype)
    var Constructor = [].shift.call(arguments)
    obj.__proto__ = Constructor.prototype
    var res = Constructor.apply(obj,argments)
    return typeof res = 'Object'?res:obj
}

如何正确的判断this

暂且简陋的归纳。。。

var obj = {
    a: 1,
    b: function(){
        console.log(this);
        }
}

1、作为对象调用时,指向该对象 obj.b(); // 指向obj

2、作为函数调用, var b = obj.b; b(); // 指向全局window

3、作为构造函数调用 var b = new Fun(); // this指向当前实例对象

4、作为call与apply调用 obj.b.apply(object, []); // this指向当前的object