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__属性是指向原型对象的,因此,我们将一个对象的实例作为另一个对象的原型对象,就会形成一个原型链,也就可以实现简单的简单继承了。

 

原文地址:https://www.cnblogs.com/diligentYe/p/6413132.html