js new关键字

407 阅读1分钟

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;
}

  1. 创建一个空对象 obj;
  2. 把 obj 的__proto__ 指向构造函数 Animal 的原型对象 prototype,此时便建立了 obj 对象的原型链:obj->Animal.prototype->Object.prototype->null
  3. 在 obj 对象的执行环境调用 Animal 函数并传递参数 “ cat ” 。 相当于 var result = obj.Animal("cat")。 当这句执行完之后,obj 便产生了属性 name 并赋值为 "cat"。关于 call 的用法请参考: 深入理解 call、apply 和 bind
  4. 考察第 3 步的返回值,如果无返回值 或者 返回一个非对象值,则将 obj 作为新对象返回;否则会将 result 作为新对象返回。

根据以上过程,我们发现 cat 其实就是【4】的返回值,因此我们对 cat 对象的认知就多了一些

原文链接