在JavaScript中,每个函数都有一个prototype属性。
构造函数也是函数,当然也有prototype属性。
构造函数的英文为constructor,我觉得把constructor翻译成创建者、创造者,相比之构造者,更容易让人直观地理解其意义。因为在日常生活中,我们会说谁谁创造了一个东西,而鲜有说谁谁构造了什么。
函数的prototype属性对应了一个对象,我们称之为prototype对象(也即原型对象),prototype对象里有一个constructor属性,指向了创造了它的函数。
借用一张图来表示:
我觉得创造构造函数这个概念的人,他运用到了造物主的概念。所以我也从造物主的角度,解释一下这几个的关系。
我们假设有一个神,他以他的形象创造了人,他就是constructor(创造者),而prototype就是这个神流传下来的DNA。而且,这位神把他的DNA上作了标记指向自己(constructor),好让他的后代能知道是谁创建了他们。
这也直观的解释了,构造函数的prototype属性指向的原型对象里,为什么会有一个constructor属性又指回给构造函数了。(以前我觉得这样指过去又指回来似乎有病,不过从造物主的角度看,似乎就能说通它的意义所在了。)
而实例则是这个神以自己的形象创造出来的一个个具体的人,比如这个人是亚当。亚当拥有一个_proto_属性,这个属性则是亚当的DNA,而DNA是从神身上继承而来的,所以亚当的DNA和神的DNA应该是一样的。也就是说亚当的DNA属性_proto_和神的DNA属性prototype,是一样的。也即,实例_proto_属性指向的也就是construtor的prototype属性指向的对象。
理解了没有呢?