new都干了啥
function MyNew() { var object = new Object(); // 1生成一个实例对象 var constructor = [].shift.call(arguments); // 取到构造函数 var args = arguments; // 渠道构造函数的参数 object.__proto__ = constructor.prototype; // 2给实例对象绑定原型 constructor.apply(object, args); // 3给实例对象绑定内部属性/方法 return object; // 4返回实例对象 } function Person(name, age) { this.name = age; this.aget = age; } var person = MyNew(Person, "Tom", 20); person.name => "Tom" person.age => 20 person instanceof Person => true person.constructor === Person => true
new 的过程其实主要分成四步
- 生成一个空对象实例
- 给实例绑定原型
- 给实例赋予构造函数的属性/方法
- 返回这个实例对象
看到别人解释,感觉也是对的(出处我就不知道了)
function myNew() { var constructor = [].shift.call(arguments); // 取得构造函数 var args = arguments; // 取得参数 var object = Object.create(constructor.prototype); // 1创建一个原型是构造函数的对象 constructor.apply(object, args); // 2将对象和参数放到放回构造函数中执行 return object // 3返回对象 }
涉及到的知识
- new 都干了啥
- arguments属于类数组对象,除了length和索引值之外没有Array的其他属性
- call和apply可以转换函数内的上下文this
- 构造函数会有个原型,用构造函数的prototype属性指向它
- 实例对象的__proto__ 会指向 构造函数的原型