我们在定义对象的时候通常使用两种方式
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 你懂了吗???