模拟实现new之前我们首先要了解new操作符做了什么,先上mdn上的定义:
new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下的操作:
1、创建一个空的简单JavaScript对象(即{});
2、 链接该对象(即设置该对象的构造函数)到另一个对象 ;
3、将步骤1新创建的对象作为this的上下文 ,如果该函数没有返回对象,则返回this。
(注意构造函数中的this关键字,它就代表了新创建的实例对象。)
模拟代码实现放在前面:
function objFactory() {
// 1、创建一个新对象
const obj = new Object();
// 获取到传入的函数对象
const Fn = [].shift.call(arguments);
// 2、将新创建的对象指针指向构造函数的原型对象
obj.__proto__ = Fn.prototype;
// 3、将this绑定到新创建的对象上
const ret = Fn.apply(obj, arguments);
// 4、此处使用instanceof判断,返回值如果是对象上的实例,则返回该对象;否则返回新创建的obj
return ret instanceof Object ? ret : obj;
}
若无法完全了解new操作符究竟会有哪些表现也没关系,下面我们一步一步来探索它~(只有完全了解了new的特性,才能正确进行模拟,因此后续其他探索章节都将以探索形式展开)
一、探索new操作符的具体表现
示例一:new的基本使用方式,生成了实例对象p1
function Person(name, age) {
this.name = name;
this.age = age;
}
const p1 = new Person('Jane', 18);
p1; // Person {name: 'Jane', age: 18}
p1.name; // 'Jane'
p1.age; // 18