先看实现
// 构造一个New函数
function New(func) {
let o = {};
o.__proto__ = func.prototype;
Object.setPrototypeOf(o, func.prototype);
func.call(o);
return o;
}
function Person() {
this.age = 23
}
Person.prototype.male = 'man';
let p = New(Person);
console.log(p);
console.log(p instanceof Person);
console.log(typeof p);
console.log(p.male);

屏幕快照 2019-03-25 下午3.30.54.png
new的时候发生了什么?
var o = new Object();
o.[[prototype]] = func.prototype;
func.call(o);
- 声明一个空对象
- 将function的原型对象赋值给 o 的内部属性
- 通过func.call 将 this.age等变量绑定到o上
- return o
__proto__是 大多数浏览器厂商支持的,可用于改变一个对象[[prototype]]属性,此特性已经从Web标准中废弃,建议使用Object.setPrototypeOf(obj, prototype) 和Object.getPrototypeOf() 函数来改变或是获取此[[prototype]]