new和构造函数干的那些事
tcking opened this issue · 0 comments
tcking commented
和关键字new
搞搭档的函数都可以叫构造函数,理解通过构造函数创建对象的过程有助于理解this
和prototype
。
构造函数的返回值
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"
创建对象的过程
- 创建一个新对象
- 将新对象设置为this并初始化
- 将对象的原型属性(
__proto__
)设置为构造函数的prototype
属性对象
构造函数的prototype属性
- 每个构造函数都有一个
prototype
属性,但是其prototype不是指向构造函数本身的原型,而是其创建的对象原型都会指向这个prototype
属性,其构造函数本事的原型(__proto__
)为Function.prototype ,详细可参考 #4 - 构造函数的prototype对象的constructor指向函数本身,instanceof就是根据constructor来进行判断的,但是constructor并不受保护可以被覆盖,因此instanceof可能会失效