(三)实现一个 new

new 的过程
  • 新生成了一个对象
  • 链接到原型
  • 绑定 this
  • 返回新对象
function create() {
	// 创建一个空的对象
	let obj = new Object()
	// 获得构造函数;shift是将数组的第一个值弹出并返回该值
	let Con = [].shift.call(arguments)
	// 链接到原型
	obj.__proto__ = Con.prototype
	// 绑定 this,执行构造函数
	let result = Con.apply(obj, arguments)
	// 确保 new 出来的是个对象
	return typeof result === 'object' ? result : obj
}
function Foo() {}
// function 就是个语法糖
// 内部等同于 new Function()
let a = { b: 1 }
// 这个字面量内部也是使用了 new Object()

对于new而言还需要注意运算符优先级

function Foo() {
    return this;
}
Foo.getName = function () {
    console.log('1');
};
Foo.prototype.getName = function () {
    console.log('2');
};

new Foo.getName();   // -> 1;相当于先执行new (Foo.getName())
new Foo().getName(); // -> 2;相当于先new Foo()再执行getName()
原文地址:https://www.cnblogs.com/smileyqp/p/12675344.html