理解new和实现一个new

为啥要用new: 在javascript中, 通过new可以产生原对象的一个实例对象,而这个实例对象继承了原对象的属性和方法。

new操作符干了什么:

  1. 创建一个新对象。
  2. 新对象隐式原型链接到构造函数显式原型。
  3. 执行构造函数并将构造函数作用域指向新对象。
  4. 返回新对象。

new的过程中遇到的坑一:

我们看到: new Function返回的是一个函数, new Object返回的是一个对象,那么什么是普通对象什么是函数对象?

通过查找资料发现有这么一句话:凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。

new的过程中遇到的坑二:

我们看到new一个普通对象报错,new一个函数对象才可以,对于这个结果很好奇为什么?于是又查资料。

原型对象:

1).显式原型: 每个函数对象都有prototype属性,称为显式原型
2).隐式原型: 每个普通对象都有_proto_属性,指向的是相对应的构造函数的prototype,称为隐式原型
复制代码

是不是可以这么理解,new一个普通对象,因为只有函数对象才有prototype属性,所以普通对象无法通new来创建一个新对象。只有通过函数对象来用new创建一个新的普通对象。

分析上面步骤的具体内容:

  1. new就是根据一个a(函数)对象创建了一个新的b(普通)对象。
  2. b属于普通对象,那么就有__proto__属性,普通对象的__proto__属性指向他的构造函数(函数对象)的prototype,所以a是b的构造函数,b是a的实例对象。
  3. 通过执行构造函数给b对象添加属性,构造函数的this指向b对象。

具体实现步骤:

    function _new (fn) {
        var obj = {
            __proto__ : fn.prototype,
        };
        var res = fn.call(obj);
        return Object.prototype.toString.call(res) === "[object Object]" ? res  : obj;
    }
复制代码

我们来运行一下代码:

可以看到我们实现了new操作符所干的事。 但是有这种情况: var o3 = new fun ('tom');,而且如果构造函数包含好几个属性,在new的过程中,有可能会传入多个参数。 我们需要改造一下:

function _new (fn) {
    return function () { // 返回一个函数,调用此函数时传入的参数达到new带参数的目的。
        var obj = {
            __proto__ : fn.prototype,
        };
        var res = fn.apply(obj, arguments);
        return Object.prototype.toString.call(res) === "[object Object]" ? res  : obj;
    }
}
复制代码

我们再来运行一下代码:

虽然没有像new那么简结,但是也算是实现了我们想要的。

当然使用闭包的方式会有内存泄漏的风险!所以我们还可以改造一下:

function _new () {
	var fn = [].shift.call(arguments);
	//var ags = [].prototype.slice.call(arguments, 1);
    var obj = {
        __proto__ : fn.prototype,
    };
    var res = fn.apply(obj, arguments);
    return Object.prototype.toString.call(res) === "[object Object]" ? res  : obj;
}
复制代码

完美! 如果上面分析有误,请及时在评论区指正,谢谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值