时间:2021-08-26 08:12:05 | 栏目:JavaScript代码 | 点击:次
new操作符的基本过程:
1.创建一个新的空对象。
2.将构造函数的作用域赋给它(即this指向它)。
3.新对象增加构造函数的基本方法和属性。
4.返回新对象
上面的过程大家应该都熟悉,本文是重学 JS 系列的第一篇文章,写这个系列的初衷也是为了夯实自己的 JS 基础。既然是重学,肯定不会从零开始介绍一个知识点,如有遇到不会的内容请自行查找资料。
new 的作用
我们先来通过两个例子来了解 new 的作用
function Test(name) { this.name = name } Test.prototype.sayName = function () { console.log(this.name) } const t = new Test('yck') console.log(t.name) // 'yck' t.sayName() // 'yck'
从上面一个例子中我们可以得出这些结论:
但是当下的构造函数 Test 并没有显式 return 任何值(默认返回 undefined),如果我们让它返回值会发生什么事情呢?
function Test(name) { this.name = name return 1 } const t = new Test('yck') console.log(t.name) // 'yck'
虽然上述例子中的构造函数中返回了 1,但是这个返回值并没有任何的用处,得到的结果还是和之前的例子完全一样。
那么通过这个例子,我们又可以得出一个结论:
试完了返回原始值,我们再来试试返回对象会发生什么事情吧
function Test(name) { this.name = name console.log(this) // Test { name: 'yck' } return { age: 26 } } const t = new Test('yck') console.log(t) // { age: 26 } console.log(t.name) // 'undefined'
通过这个例子我们可以发现,虽然构造函数内部的 this 还是依旧正常工作的,但是当返回值为对象时,这个返回值就会被正常的返回出去。
那么通过这个例子,我们再次得出了一个结论:
这两个例子告诉了我们一点,构造函数尽量不要返回值。因为返回原始值不会生效,返回对象会导致 new 操作符没有作用。
通过以上几个例子,相信大家也大致了解了 new 操作符的作用了,接下来我们就来尝试自己实现 new 操作符。
自己实现 new 操作符
首先我们再来回顾下 new 操作符的几个作用
回顾了这些作用,我们就可以着手来实现功能了
function create(Con, ...args) { let obj = {} Object.setPrototypeOf(obj, Con.prototype) let result = Con.apply(obj, args) return result instanceof Object ? result : obj }
这就是一个完整的实现代码,我们通过以下几个步骤实现了它:
接下来我们来使用下该函数,看看行为是否和 new 操作符一致
function Test(name, age) { this.name = name this.age = age } Test.prototype.sayName = function () { console.log(this.name) } const a = create(Test, 'yck', 26) console.log(a.name) // 'yck' console.log(a.age) // 26 a.sayName() // 'yck'
虽然实现代码只有寥寥几行,但是结果很完美
最后