构造函数,对象原型,实例对象三者之间的关系

1.构造函数,原型对象,实例对象三者之间的关系函数

每建立一个函数,该函数都会自动带有一个prototype属性。该属性是一个指针,指向一个对象,该对象称之为原型对象(后期咱们可使用这个原型对象帮助咱们在js中实现继承).this

原型对象上默认有一个属性constructor,该属性也是一个指针,指向其相关联的构造函数。spa

经过调用构造函数产生的实例对象,都拥有一个内部属性,指向了原型对象。其实例对象可以访问原型对象上的全部属性和方法。prototype

总结:三者的关系是,每一个构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,而实例都包含着一个指向原型对象的内部指针。通俗的说,实例能够经过内部指针访问到原型对象,原型对象能够经过constructor找到构造函数。设计

实例指针

function People(){
    this.type='人'
}
People.prototype.showType=function(){
    alert(this.type);
}

var person=new People();
//调用原型对象上面的方法
person.showType();//最后结果弹框弹出人

  以上代码定义了一个构造函数People(),People.prototype指向原型对象,其自带属性construtor又指回了People,即People.prototype.constructor==People.实例对象person因为其内部指针指向了原型对象,因此能够访问原型对象上的showType方法。code

  

记住People.prototype只是一个指针,指向的是原型对象,利用这个指针能够帮助咱们实现js继承对象

2.原型链blog

  在第一部分咱们说到,全部的实例都有一个内部指针指向他的原型对象,而且能够访问到原型对象上的全部属性和方法。person实例对象指向了People的原型对象,能够访问People原型对象上的全部属性和方法。若是People原型对象变成了某一个类的实例aaa,这个实例又会指向一个新的原型对象AAA,那么person此时能访问aaa的实例属性和AAA原型对象上的全部属性和方法了。同理新的原型对象AAA碰巧有事另一个对象的实例bbb,这个对象实例指向原型对象BBB,那么person就能访问bbb的实例属性和BBB原型上的属性和方法了。
继承

function People(){
    this.type='人'
}
People.prototype.showType=function(){
    alert(this.type);
}
function Woman(){
    this.sex='女';
    this.age=34;
}
Woman.prototype=new People();
var w=new Woman();
console.log(
'你们好,个人种类是:'+w.type+",个人年龄是:"+w.age+",个人性别是:"+w.sex);
//输出结果:
//你们好,个人种类是:人,个人年龄是:34,个人性格是:女
//w.type是People上面定义的type

解释一下以上代码.以上代码,首先先定义了People构造函数,经过new People()获得实例,会包含一个实例对象type和一个原型属性showType。另外定义一个Woman构造函数,而后状况发生变化,原本构造函数woman的prototype会执行Woman的原型对象,可是咱们这里稍有改变,将Woman构造函数的prototype指向了People实例对象覆盖了woman的原型对象。当Woman的实例对象woman去访问type属性时,js首先在woman实例属性中查找,发现没有定义,接着去woman的原型对象上找,woman的原型对象这里已经被咱们改为了People实例,那就是去People实例上去找。先找People的实例属性,发现没有type,最后去People的原型对象上去找,终于找到了。这个查找就是这么一级一级的往上查找。

function People(){
    this.type='人'
}
People.prototype.showType=function(){
    alert(this.type);
}
function Woman(){
    this.sex='女';
    this.age=34;
this.type='女生';//若是这里定义了type属性,就不会层级查找,最后在People找到该属性 } Woman.prototype
=new People(); var w=new Woman(); console.log('你们好,个人种类是:'+w.type+",个人年龄是:"+w.age+",个人性别是:"+w.sex); //输出结果: //你们好,个人种类是:女生,个人年龄是:34,个人性格是:女

       这就说明,咱们能够经过原型链的方式,实现 Woman继承 People 的全部属性和方法。

  总结来讲:就是当重写了Woman.prototype指向的原型对象后,实例的内部指针也发生了改变,指向了新的原型对象,而后就能实现类与类之间的继承了。

(文章内容全都参考于《JAVASCRIPT 高级程序设计》)

相关文章
相关标签/搜索