[什么是原型]
原型是函数对象的一个属性,它定义了构造函数制造出的对象的公共祖先,通过该构造函数产生的对象,可以继承该原型的属性和方法,同时原型也是一个对象。
[constructor]
补充我在构造函数内没有的讲的,我们知道person1 和 person2 都是Person构造函数构造出来的实例,同时我们提出来了一个新的概念constructor 是构造的意思,在学完es6之后我发现这个constructor在某种意义上和类很相似,这里不做详细解释。
function Person(name, age) { this.name = name; this.age = age; } var person1 = new Person('hehe',18); var person2 = new Person('haha',18);
person1和person2的constructor都指向了Person。
[prototype]
Person.prototype.sex='male'; console.log(person1.sex); //male
这个Person.prototype就是原型,它在出生时就被定义好了,我们说了它指向原型对象,我们在上面给它添加了一个sex属性值为male,这个对象可以理解为是person1和person2的共有的祖先,当自身没有这个属性时,它就会沿着原型链往上寻找。
继续探究Person.prototype,我们发现内部也含有一个隐式属性是constructor巧了它指向的和那两个实例一样,也是Person,我的理解是Person.prototype也是Person的一个实例.也是所有实例的祖先。
[__proto__]
上面我提到了原型链,这也是person1上可以访问sex属性的原因。那么什么是原型链呢?
我们输出person1.__proto__会发现就是Person.prototype,通过proto属性把原型和这个对象联系起来,当这个对象上没有这个属性时就会访问proto索引看看上面有没有,如果还没有就继续沿着proto向上寻找。
[总结]
1.构造函数Person有属性prototype指向原型(Person.prototype)
2.构造函数的实例person1,person2有属性__proto__也指向Person.prototype
3.person1,person2以及Person.prototype都有construtor属性指向构造函数Person