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