前言
玩过原型链继承(类继承)的娃应该都用过var instance = new Class()
之类的代码。但是你真的了解new
吗?
大家都知道new
操作符用作实例化,但是实例化的过程中除去返回对象它还做了什么?
绑定this到实例
1 | function Student(name){ |
由此可见,new
操作符将构造函数Student
中的this
指向了new Student()
生成的对象student
。
原型链连接
1 | function Test(name) { |
通过new
操作符将实例t
与构造函数Test
连接起来。
通过new
操作符将实例和构造函数连接起来。相当于student.__proto__ = Student.prototype
。
当然我们可以通过setPrototypeOf
完成。有兴趣的boy可以了解一下。
返回值
原始值
1 | function Test(name) { |
- 构造函数如果返回原始值(虽然例子中只有返回了 1,但是你可以试试其他的原始值,结果还是一样的),那么这个返回值毫无意义
对象
1 | function Test(name) { |
- 构造函数如果返回值为对象,那么这个返回值会被正常使用
实现
我们在coding
前先理一下思路
- 创建新对象
- 将构造函数的作用域赋给新对象(
obj.__proto__ = Base.prototype
) - 执行构造函数中的代码(
Base.call(obj, ...args)
) - 返回新对象
OK, let's coding
1 | /** |
咱们来试一下这DIY的东西好不好用
1 | function Constructor(name){ |
有没有发现,和咱们之前的一模一样欸。所以这东西就到此结束。
总结
最后总结一下
- 将
this
绑定到实例 - 原型链连接
- 返回值为对象