javascript 编程反思1 new 原理

我们在定义对象的时候通常使用两种方式

1:通过new 关键字创建对象

2:直接定义对象 var o={};

第二种一般比较容易理解,就是直接创建一个空对象,但是第一种 通过new 的方式具体原理和细节是比较模糊的,举例来说

 

function foo(){
    this.name="demo"
    //return  {};
}
foo.prototype.show=function(p){
    console.log(p);
}
var f=new foo();
console.log(f.name);// demo
f.show("lee");// lee

 f 是一个对象,为什么就具有了name 属性?

 

我们来仔细分析一下创建f 对象的过程,

1:js 解析器遇到new 关键字以后首先会创建一个空对象,var f={};这个f 没有任何内容,仅仅有__prop__

这些继承Object prototype 中的东西,

2:更换prototype 对象,把这个f.__prop__ 这个原始对象替换为foo.prototype 对象,这个很重,这里反复提起prototype 是一个对象的概念,具体原理可以查阅一下其他资料,

     当第二步骤执行完以后,f.show 就可以执行了,

3:执行构造器 foo() ,传f 进入构造器代替原先的this ,可以这样理解foo.call(f); 里边的代码this.name="demo" 实际执行变成了f.name="demo",

      当第三步执行完成,f.show 就可以执行了,因为show 已经在f对象的原型链上了,具体原型链的概念和原型链的查找原理这里不做赘述,

4:返回构造器执行结果,如果构造器中有了return ,如果有了return 那么前几步统统作废,所有的结果就变成了return 的结果,不过通过构造器做return 的不是很普遍。

 

 

new 你懂了吗???

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值