你的位置:首页 > Java教程

[Java教程]js new都做了什么 prototype __proto__


现在对自己之前理解的东西,总结下,整理到这,看我那会画的一张图,我都不知道在说什么,那会的瞬间都疏通的感觉,现在基本都模糊了,我这脑子真是。。。

言归正传 开始:

一:思考new都做了什么,下面一个例子 

function A (){    var a1=111;    this.a2=222;    function fa(){      console.log(a1);    }    fa();  }A.prototype.a3="333";var b = new A();

  new一个构造函数,

  1:会先新建一个对象,比如 var o={};

  2:然后o对象的__proto__=A函数的prototype,

  3:以o为执行环境执行A,A.apply(o,[arg])

    apply是什么,就是执行时,改变执行上下文,把A执行环境中的this 变成o,

    看到很多地方说,apply与call的区别,我认为区别就是他们两个传参不同,apply是数组形式 :apply(obj,argument)argment是一个数组,call直接是值形式 :call(obj,name,age)

 

  4:看A函数返回值的情况,然后b是什么,针对上一个的例子,b指向 {a2:222} ,里面的__proto__ ,constructor等一会说 

 

        文章中黄色部分不大理解,按说他是系统生成的o对象,但是他为什么是A{}?

 

    现在来看a方法返回值的各种情况的列子,来看b是什么

    1:什么不返回的情况 

    

    2:返回 数据类型的情况

      

    3:返回 引用类型的情况

    

   总结,当new一个函数时,如果函数有返回,如果是数据类型,直接忽视,返回系统生成的对象,如果返回的复杂数据类型,那么就是复杂数据类型,如果没有返回,就是系统生成的对象

二 prototype

  每个函数都有prototype(原型)属性,他的值是对象(属性集合)

  

  只有一个constructor 属性,指向本身,既然他的值是对象,包括constructor和__proto__属性,同时可以自定义属性,例如:

  

 

三:__proto__

  __proto__是隐形属性,每个对象都有这个属性,实例化对象的__proto__值是指向该对象的prototype

  

 四:自定函数 对象 Object Function他们之间prototype __proto__的联系

 

  注意自定义函数b的prototype属性集合中的__proto__,或是说整个prototype是对象,他的__proto__,指向的是最底层的Object对象,如果下面这种new的情况,

var a = function() { this.a1="a";};
var b = function() { this.b1="b";};
var c = function() { this.c1="c";};
b.prototype = new a();
c.prototype = new b();


  b.prototype={a1:"a"};

  b.prototype.__proto__=a.prototype ,a.prototype的值 是constructor 和__proto__(指向的是最底层的Object{}),

  c.prototype={b1:"b"};

  c.prototype.__proto__=b.prototype ——》指向{a1:"a"};

 

不知道有没有理解不对的地方啊啊啊啊啊。。。。