new关键字做了什么
function Animal(name){
this.name = name;
}
var cat = new Animal("cat")
Animal 本身是一个普通函数,但当通过new来创建对象时,Animal 就是构造函数。
JS引擎执行这句代码时,在内部做了很多工作,用伪代码模拟其内部流程如下:
new Animal('cat') = {
var obj = {};
obj.__proto__ = Animal.prototype;
var result = Animal.call(obj,"cat");
return typeof result === 'object'? result : obj;
}
- 创建一个空对象 obj;
- 把 obj 的__proto__ 指向构造函数 Animal 的原型对象 prototype,此时便建立了 obj 对象的原型链:obj->Animal.prototype->Object.prototype->null
- 在 obj 对象的执行环境调用 Animal 函数并传递参数 “ cat ” 。 相当于 var result = obj.Animal("cat")。 当这句执行完之后,obj 便产生了属性 name 并赋值为 "cat"。关于 call 的用法请参考: 深入理解 call、apply 和 bind
- 考察第 3 步的返回值,如果无返回值 或者 返回一个非对象值,则将 obj 作为新对象返回;否则会将 result 作为新对象返回。
根据以上过程,我们发现 cat 其实就是【4】的返回值,因此我们对 cat 对象的认知就多了一些