十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
我们先来通过两个例子来了解 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'
复制代码
从上面一个例子中我们可以得出这些结论:
new
通过构造函数 Test
创建出来的实例可以访问到构造函数中的属性new
通过构造函数 Test
创建出来的实例可以访问到构造函数原型链中的属性,也就是说通过 new
操作符,实例与构造函数通过原型链连接了起来但是当下的构造函数 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
操作符会返回一个对象,所以我们需要在内部创建一个对象this
,可以访问到挂载在 this
上的任意属性回顾了这些作用,我们就可以着手来实现功能了
function create(Con, ...args) {
let obj = {}
Object.setPrototypeOf(obj, Con.prototype)
let result = Con.apply(obj, args)
return result instanceof Object ? result : obj
}
复制代码
这就是一个完整的实现代码,我们通过以下几个步骤实现了它:
obj
obj
对象需要访问到构造函数原型链上的属性,所以我们通过 setPrototypeOf
将两者联系起来。这段代码等同于 obj.__proto__ = Con.prototype
obj
绑定到构造函数上,并且传入剩余的参数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'
复制代码
虽然实现代码只有寥寥几行,但是结果很完美
我们通过这篇文章重学了 new
操作符,如果你还有什么疑问欢迎在评论区与我互动。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。