现在对自己之前理解的东西,总结下,整理到这,看我那会画的一张图,我都不知道在说什么,那会的瞬间都疏通的感觉,现在基本都模糊了,我这脑子真是。。。
言归正传 开始:
一:思考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"};
不知道有没有理解不对的地方啊啊啊啊啊。。。。