本文共 890 字,大约阅读时间需要 2 分钟。
用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()
方法:删除数组第一项,并返回删除项。
转载地址:http://hnuvi.baihongyu.com/