模拟实现构造函数new的过程 js

用new操作符创建对象时发生的事情:

(1)创建一个新对象;

(2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象);如spring.__ proto __ =  Student.prototype

(3)执行构造函数中的代码(为这个新对象添加属性和方法);

(4)返回新对象;

每个class都有显式原型 prototype;每个实例都有隐式原型 __proto__

通过new创建的对象和构造函数之间建立了一条原型链。原型链:当访问实例对象的属性和方法时,会先从自身构造函数中找,如果没有,就继续去 __proto__ 中查找。

function myNew(constructor, params) {
    var obj = new Object();  //创建一个空的对象
    var args = [].slice.call(arguments);  //将具有length属性的arguments转换为数组
    var constructor = args.shift();  //删除并拿到arguments中第一个参数,即取出构造函数
    obj.__proto__ = constructor.prototype;  //链接到原型,obj可以访问构造函数原型中的属性
    var res = constructor.apply(obj, args);  //绑定this,实现继承,obj可以访问到构造函数中的属性
    return (typeof res === 'object' && typeof res !== null) ? res : obj;  //优先返回构造函数返回的对象
}

[].slice.call(arguments):能够将具有length属性的arguments转换为数组

slice(start, end) 方法:可提取数组的某个部分,并以新的数组返回被提取的部分。
使用start(包含) 和 end(不包含) 参数来指定提取数组开始和结束的部分

shift() 方法:删除数组第一项,并返回删除项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值