new出来的实例对象可以:数组
function mynew(){ let obj = new Object(), //从Object.prototype上克隆一个对象,做为初始化,为了方便后面赋值给函数的实例 Constructor = [].shift.call(arguments); //取得第一个参数,即外部传入的构造器,此外由于 shift 会修改原数组,因此 arguments 会被去除第一个参数 let F = function() {}; //为了使obj能经过F与Constructor.protptype产生关联(要想两个对象之间产生__proro__这样的关联,就须要新建一个函数,做为构造函数,经过构造函数的原型指向对象二,对象一是构造函数的实例) F.prorotype = Constructor.prototype; obj = new F(); //这样obj,就能访问构造函数Constructor .prototype上的属性了 Constructor.apply(obj, arguments); //借用外部传入的构造器给obj设置属性 return obj }
new出来的对象可以作到两件事:一、访问构造函数里的属性,二、访问构造函数的原型对象上的属性。因此若是手写new的话就要实现:传入构造函数和参数,返回一个对象(若是构造函数没有默认返回的话),而且使原型对象在这个返回的对象的原型链上。app
首先声明一个对象obj,从Object.prototype上克隆一个对象,而后从传入的arguments里获取第一个参数,即构造函数。函数
而后再声明一个匿名函数,使匿名函数的原型指到构造函数的原型上。this
再建立一个匿名函数的实例,赋给obj。spa
这样obj,就能访问构造函数Constructor .prototype上的属性了。prototype
最后利用apply将传入的构造函数的this的指向obj,而且给obj设置属性。code