tcking/jsriver

new和构造函数干的那些事

tcking opened this issue · 0 comments

和关键字new搞搭档的函数都可以叫构造函数,理解通过构造函数创建对象的过程有助于理解thisprototype

构造函数的返回值

1.如果构造返回undefined(也就是没有写return,只写了个return或者return undefined),则new出来的就是一般意义上由构造函数创建的对象。

function Cat(){
    this.name="tom";
}
console.log(new Cat().name);// "tom"

2.如果构造函数返回的是原子对象,则和情况1一样。

function Cat(){
    this.name="tom";
    return 0;//return "0" ,null,true   都一样
}
console.log(new Cat().name);// "tom"

3.如果返回的是对象,则new+构造函数就是构造函数本身的返回值。

function Cat(){
    this.name="tom";
    return {name:"jerry"};
}
console.log(new Cat().name);// "jerry"

创建对象的过程

  1. 创建一个新对象
  2. 将新对象设置为this并初始化
  3. 将对象的原型属性(__proto__)设置为构造函数的prototype属性对象

构造函数的prototype属性

  1. 每个构造函数都有一个prototype属性,但是其prototype不是指向构造函数本身的原型,而是其创建的对象原型都会指向这个prototype属性,其构造函数本事的原型(__proto__)为Function.prototype ,详细可参考 #4
  2. 构造函数的prototype对象的constructor指向函数本身,instanceof就是根据constructor来进行判断的,但是constructor并不受保护可以被覆盖,因此instanceof可能会失效