JS中new的过程发生了什么以及实现过程

举一个简单例子

// 构造函数
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, '小韭菜')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值