首先,我们需要了解三点:
1. 只要创建一个任意新函数,就会根据一个prototype属性,该属性指向函数的原型对象;
2. 每一个原型对象都会自动获得一个constructor属性,该属性只想prototype所在函数的指针;
3. 当调用构造函数创建实例时,该实例内部将包含一个指向构造函数原型对象的指针,在大部分浏览器中用__proto__标识;
从上面这三点我们可以了解到:
正常情况下:prototype属性 -> 原型对象
原型对象的constructor属性 -> 构造函数(即拥有prototype属性的函数)
每一个创建的事例中都有一个__proto__(姑且这么认为)-> 构造函数的原型对象。
以上只是正常情况下它们之间的关系。
在原型上定义属性的方法可以分为两种:
// 第一种:直接在原型对象上添加属性
Animal.prototype.sayHi = function() {
console.log("Hi!");
}
// 第二种:使用字面量创建一个新对象相当于new Object(),
// 将新对象的引用赋值给Animal的prototype属性;
// 该新对象是由Object()创建的实例,
// 该实例的__proto__指向Object()的原型对象,也就是Object.prototype;
// 因此:animal的__proto__最后指向新创建的对象
// constructor也指向Object构造函数
Animal.prototype = {
sayHi: function() {
console.log("Hi!");
}
}
var animal = new Animal();
从上面第二段代码中,我们可以看出,我们可以构造函数的prototype的指向。
并且我们知道,我们了解实例中的__proto__属性是指向原型对象的,因此,我们将一个对象的实例作为另一个对象的原型对象,就会形成一个原型链,也就可以实现简单的简单继承了。