JS中new的过程发生了什么以及实现过程
举一个简单例子
1 2 3 4 5 6 | // 构造函数 function WhatNew(name) { this .name = name } let news = new WhatNew( '小韭菜' ); |
通过构造函数创建的对象,原理是原型链的存在,每个构造函数都有一个prototype属性(函数特有属性),它指向构造函数的原型对象(WhatNew.prototype),而__proto__是每个对象都包含的一个方法,它是实例的方法,也是指向原型对象。
如果将两者赋值相等,那么就可以共享原型对象的属性和方法,如下
WhatNew.prototype === news.__proto__ //true
对象的继承是通过原型链,而原型链就是通过__proto__一层一层的往上找而形成的链式结构,直到最后找到null。
那么new的过程发生了什么?
1、new先创建了一个空对象
var news = new Object()
2、我们将这个空对象的__proto__属性指向whatnew构造函数的prototype属性,使两者都有共同的原型对象whatnew.prototype,因此空对象可以访问whatnew函数
new.__proto__ = whatnew.prototype
3、修改whatnew的this到object上面,call/apply,并把参数传入
4、最后把object返回给mynew就可以了
实现一个new方法
function Mynew(fun, ...arg) { let obj = { __proto__: fun.prototype } fun.apply(obj, arg) return obj } function person(age, name) { this.age = age this.name = name } let mynew = Mynew(person, 18, '小韭菜')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2021-05-11 Vue Element table 合并行