目录
1. new 的过程
2. __proto__属性
3. prototype属性
4. constructor属性
5. 原型继承
new的过程
function Foo() {...};
let f1 = new Foo();
上面代码首先创建一个构造函数Foo(),并用new操作符来生成了一个实例对象f1。
new 会劫持所有普通函数并用构造对象的形式来调用它。
在调用 new
的过程中会发生以下四件事情:
- 新生成一个空对象
- 链接到原型
- 绑定this
- 返回新对象
具体实现为:
const isComplexDataType = obj => {
return (typeof obj === 'object' || typeof obj === 'function') && obj !== null
}
function _new(fn, ...arg) {
// 首先创建一个空的对象,空对象的__proto__属性指向构造函数的原型对象
var obj = Object.create(fn.prototype)
// 把上面创建的空对象赋值构造函数内部的this,用构造函数内部的方法修改空对象
const result = fn.apply(obj, arg)
// 如果构造函数返回一个非基本类型的值,则返回这个值,否则返回上面创建的对象
return isComplexDataType(result) ? res