You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionmyNew(){letobj=newObject(),[constructor,...args]=[...arguments]obj.__proto__=constructor.prototype;letres=constructor.apply(obj,args)return=typeofres==='object' ? res : obj;}
手写一个自己的 myNew 小结
如果自己实现一个 new 的话,首先要满足它的几点效果
一个构造函数会返回一个对象,那函数里就应该有对象
letobj={}
并将其__proto__属性指向构造函数的prototype属性
obj.__proto__=constructor.prototype
调用构造函数,绑定 this
constructor.apply(obj,args)
返回原始值需要忽略,返回对象需要正常处理
resinstanceofObject ? res : obj
箭头函数使用new
但是 ES6 中介绍了一种无法使用这些规则的特殊函数类型:箭头函数
varFoo=()=>{}varfoo=newFoo()// TypeError: Foo is not a constructor
title: 手写实现New操作符
手写实现 JavaScript 中的 New 操作符
延伸的面试题
根据
new操作符
相关的知识点一般会 延伸出以下的面试题 ,面试官你是否有很多问号mdn 关于 new 运算符关键字的描述
以上 4 条是
MDN
上关于 new 操作符(或者说关键字)的描述,那么当new
的时候 引擎做了几件事呢构造函数中的this其实就是新对象本身
简单的来体验下利用构造函数来
new
一个对象既然我们通过自定义,其使用的方式大体跟
new
是一样的。第一版的 myNew
大体思路是声明一个对象,取出当前的构造函数,以及参数,让新对象的原型属性指向构造函数的原型,然后调用构造函数,传入对象的参数
第二版的 myNew
经过上文的简单案例我们可以得知,
new
一个构造函数得到一个对象,它的原型属性(也就是** proto **)与该构造函数的原型是全等new
通过构造函数Persion
创建出来的实例可以访问到构造函数中的属性,就像这样言简意赅:new 出来的实例对象通过原型链和构造函数联系起来
构造函数说白了也是一个函数,那是函数就可以有返回值
有了给构造函数返回一个值得想法,那就通过不同的
数据类型
进行测试得出结论小结
也就是说,构造函数一般不需要
return
手写一个自己的 myNew 小结
如果自己实现一个 new 的话,首先要满足它的几点效果
一个构造函数会返回一个对象,那函数里就应该有对象
并将其
__proto__
属性指向构造函数的prototype
属性调用构造函数,绑定 this
返回原始值需要忽略,返回对象需要正常处理
箭头函数使用
new
但是 ES6 中介绍了一种无法使用这些规则的特殊函数类型:箭头函数
new
命令,否则会抛出一个错误this
指向的固定化,并不是因为箭头函数内部有绑定this
的机制,实际原因是箭头函数根本没有自己的this
,导致内部的this
就是外层代码块的this
。正是因为它没有this
,所以也就不能用作构造函数。The text was updated successfully, but these errors were encountered: