用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()
方法:删除数组第一项,并返回删除项。