构造函数的深入理解(包含原型对象的初步认知)

2018-12-04  本文已影响0人  查理斯_Chalis
function Demo (name){
      console.log(this);//此时this指向一个空的狭义对象
      this.hobby();
      //这个this指向实例(实例其实就是new Demo的返回值),只是当前的实例(狭义对象)里没有属性,因为程序从上往下执行,属性没上树。实例可以通过__proto__属性访问到Demo.prototype里的方法
      this.name=name;//动态往当前狭义对象里添加一个name属性,属性值是形参name

      this.num=123;//动态往当前对象里添加一个num属性,属性值123;

      this.height=function (){//动态添加一个方法
         console.log("我身高一米八")
      }
      this.hobby();
      console.log(this);//这个this指向当前的狭义对象,里面有两个属性一个方法
  }
  console.log(Demo.prototype)//此时构造函数还没调用,Demo.prototype是一个空的狭义对象
                             //任何函数不管调不调用,都有prototype属性
  // console.log(Demo.prototype)
  Demo.prototype.hobby=function (){//此时构造函数还没调用,往Demo.prototype(原型对象)里添加一个方法共享
    console.log("我的爱好是打篮球")
  } 

 var people1=new Demo;//这里是入口函数,当new Demo执行的时候,生成一个实例,并且构造函数执行
 var people2=new Demo;
 console.log(people1.height===people2.height)//因为每一个实例的属性都是不同的()所以height也不同  
 console.log(people1.hobby===people2.hobby)//两个实例的访问地址是一样的所以相等

总结:
在new执行的时候(也就是开始实例化的时候)在构造函数内部生成了一个空的狭义对象(实例对象),new作为返回值赋值给变量的时候,返回值默认为这个狭义对象,而实例化对象可以通过proto访问到原型对象里的方法,即使是一开始为空的狭义对象,它也是一个实例,所以仍然可以访问原型对象,这也解释了为什么可以再构造函数身体中调用实例方法,换句话说,实例在new的一瞬间就生成了,为一个狭义对象。

上一篇 下一篇

猜你喜欢

热点阅读