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()