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的一瞬间就生成了,为一个狭义对象。
网友评论