今天和大家一起来聊聊构造函数,在我们js编程中构造函数常常被我们用到。之所以被我们所青睐是因为它本身有着一套逻辑可以让我们直接拿来使用,今天说一下我眼中的构造函数和实例、原型及原型链的关系。
构造函数,原型对象,实例对象三者之间的关系
每创建一个函数,该函数都会自动带有一个prototype属性。该属性是一个指针,指向与其关联的原型对象,(后期我们可以使用这个原型对象帮助我们在js中实现继承).
通过调用构造函数产生的实例对象,都拥有一个内部属性__ poroto __,指向了与其关联的原型对象。能够访问原型对象上的所有属性和方法。
原型对象上默认有一个属性constructor,该属性也是一个指针,指向与其相关联的构造函数。另一个属性__ poroto __,指向上一级的Object的原型对象。
下面我们来看一个图
总结:三者的关系是,每个构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,而实例都包含着一个指向原型对象的内部指针。通俗的说,实例可以通过内部指针访问到原型对象,原型对象可以通过constructor找到构造函数。
说到原型我们就要了解一下什么原型链
每一个构造函数的原型对象都可以通过,自带属性__ poroto __找到自己的上一级Object的原型对象,而Object原型对象再向上找时会返回null。意思就是到了尽头没有可继续追溯的内容了。
从实例开始到null 位置,层层指向的原型,所形成的链条就是原型链
那么下面我们假设有两个构造函数的实例,路人甲和路人乙,他们都互不相关,路人甲的原型上有很多的方法,可路人乙却没有。如何能让路人乙使用路人甲原型对象中的方法呢?
改变构造函数的原型指向,让它指向其他构造函数,这样实例就可以继承其他原型上的方法。
function Jia(name) {
this.name = name;
}
Jia.prototype.name = '路人甲原型的方法';
function Yi(name) {
Jia.call(this,name);
}
Yi.prototype = new Jia('我是路人甲');
var yi = new Yi('我是路人乙');
console.log(yi);
打印的结果:
结果中我们可以看到路人乙通过自带属性__ poroto __找到的是路人甲的构造函数,并且可以查看到原型上的方法。