js new关键字

要创建构造函数的实例,肯定要使用到new关键字,但是,到底需要哪些过程呢?

我们以下面为例,首先穿件一个构造函数

function dog(){

  this.name='happy'

}

接下来我们分步骤来解析创建实例的过程:

1.首先,需要创建一个空对象 var obj={}

2.接下来我们需要把obj的__proto__属性指向构造函数的prototype,   obj.__proto__=dog.prototype,

__proto__即原型属性,是每一个对象都拥有的属性,众所周知,js中所有的类型皆为对象,这个属性并非所有浏览器都有实现,而他的标准属性为[[prototype]].

而prototype是函数才拥有的属性,即原型对象。

3.接着,我们需要利用call方法,将dog函数内部的this指针替换为obj,并立即执行dog函数,由于指针被替换,所以dog函数内部的属性会被复制到obj对象,这样obj就会拥有dog所有的内部属性, dog.call(obj)

4.最后,我们判断下obj属性是否为Object类型,如果是,返回obj对象,如果不是,则返回{}

 

把上面的步骤还原成方法

function _new(){

   var obj={}

   obj.__proto__=dog.prototype

   dog.call(obj)

  return typeof obj==='object' ? obj:{}

}

当然,在实例化时,有时候会传入一些初始值,并且,我们也不会只对一个构造函数实例化,这个时候,我们只需对上面的方法进行一些改动

function _new(func) {
   var obj = {}
   obj.__proto__ = func.prototype
   const args=[].slice.call(arguments)
   args.splice(0,1)
   func.apply(obj, args)
   return typeof obj === 'object' ? obj : {}
}

这样的话,就可以满足要求啦,定义一个cat函数

function cat(name,color){

   this.name=name

   this.color=color

}

var instance=_new(cat,'ali','yellow')

   console.log(instance.name) // ali

   console.log(instance.color) // yellow

当然,在实际开发中,我们只需使用new关键就行了,上述代码只是用来解释实例化的过程。

如果有想学习web前端的程序员,加VX:TZ07900, 免费送web前端视频教程噢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值