js 的new关键字解析的过程中引擎执行了很多步骤,我们可以自己写一个仿new的函数来实现new关键字。
说js `new` 之前先说说js的构造函数和实例,实例都是构造函数生成的,也就是我们所说的对象,对象的`prototype`又指向了构造函数,这样能实例和构造函数之间能够形成关联,形成了一个 `原型链`,便于实现面向对象的编程。通过原型链可以访问构造函数里定义的属性的方法,这样同时也避免了空间浪费。
我们先来看看 `new` 函数的基本原理:
1.生成一个空对象
2.将空对象的 `prototype` 指向构造函数
3.将构造函数绑定这个对象并执行。
4.返回这个对象
那我们可以写一段代码来模拟一下:
```javascript
function _new(constructor) {
//1 创建空的对象
//2 新对象的prototype指向构造函数
var obj = {
"__proto__": constructor.prototype //必须用这种方式关联原型链
};
constructor.apply(obj,[].splice.call(arguments,1));//将构造函数绑定这个对象并执行
return obj;//返回新对象
}
//构造函数
function MyClass(name,time) {
this.name = name || '';
this.time = time || '';
}
//生成一个实例
var my = _new(MyClass,'kruz_teching','2018');
console.log(my.name);
console.log(my.time);
console.log(typeof my);
console.log(my instanceof MyClass);
```
大功告成了。