在开始之前我们先把代码都写出来分析
function foo( ){ }; //普通函数,但被new调用的时候就是构造函数,直接当成构造函数来看也行
var obj = new foo( ); // obj是实例对象,由foo创建的
var fm = foo.prototype //foo的原型对象
关系婊:foo( )(儿子)、obj(兄弟)、fm(妈妈)
妈妈fm的儿子是foo( ),obj是foo的兄弟,所以他的妈妈也是fm,所以obj继承了妈妈的基因(属性)
先理解几个点,什么是构造函数呢?
function a( ) { }; 这是一个普通的函数,名字叫a
var pbj = new a( ); 但是当他被new调用的时候就变成构造函数了,obj是实例对象
原型对象
每个构造函数都有一个原型对象,也就是妈妈,prototype指向原型对象,同时也意味着用构造函数生成的实例对象的继承了这个构造函数的原型对象的属性。
a.prototype就是构造函数 a 的原型对象,可以理解为a.prototype是 构造函数 的妈妈,而构造函数a是a.prototype的儿子
关系:a( )是个函数, a.prototype就是a( )函数的原型对象
constructor
也就是构造函数
原型对象有一个constructor属性,指向该原型对象对应的构造函数
function Foo(){};
console.log(Foo.prototype.constructor === Foo);//true
Foo.prototype(原型对象)的儿子是 构造函数Foo,其实看前缀就能知道了。
proto
实例对象都会继承其对应的原型对象的属性,所以obj继承了fm的属性,fm的属性里有constructor,指向foo( ),所以obj实例对象也会有这个属性。
实例对象都有一个proto属性,指向该实例对象对应的原型对象 ,也就是指向创建他的构造函数的原型对象,
obj.__proto__ === foo.prototype //true
意思是obj继承foo.prototype这个原型对象的属性
测试实例对象是否与构造函数指向同一个实例对象的方法
obj instanceof foo;
语法:
实例对象 instanceof 构造函数