构造函数、实例、原型、原型链之间的关系

850 阅读2分钟

1、构造函数是什么

所谓的构造函数其实就是一个普通的函数前面加了new运算符,其本质也是一个函数,所以构造函数都有函数的prototype属性。

2、实例是什么

实例就是通过构造函数创建出来的对象。

        var A = function () {
            this.name = '漩涡鸣人'
        }
        var obj = new A()

3、原型是什么

原型指的就是原型对象,至于是谁的原型对象,需要靠函数的prototype属性和实例的__proto__属性来区别。

4、原型链是什么

原型链指的是从一个实例对象开始往上找,这个实例对象的__proto__属性所指向的就是这个实例对象的原型对象。
例如:使用obj表示实例,则原型对象表示为obj._proto_。同时,这个原型对象也是一个对象。而且还有上一级的原型对象,相对于上一级原型对象而言,它也是一个实例对象,那么它也拥有__proto__属性,它的__proto__属性指向它的原型对象,后面也以此类推,直到Object.prototype这个原型为止Object.prototype做为原型链的末尾点。

原型.png

通过上图第一个红色框出来的属性可看到,obj通过调用两次__proto__属性就已经到达Object,Object是一个构造函数,Object拥有属性prototype,可以指向它的原型。第三次调用的时候已经返回空,表明Object.prototype为原型链的末端。

5、构造函数与实例之间的关系

实例是通过构造函数创建

6、构造函数与原型(对象)之间的关系

构造函数通过其属性prototype去寻找它关联的原型,如果用M表示构造函数,A.prototype所指的就是它关联的原型对象,而原型对象可以通过构造器constructor来寻找与自身关联的构造函数,所以就有A.prototype.conctructor===A。

原型1.png

7、原型对象上的属性、方法可以被实例共享

        var A = function (name) {
            this.name = name
        }
        // 构造函数原型对象上定义属性和方法
        A.prototype.country = "AS"
        A.prototype.say = function () {
            console.log('嘿嘿嘿');
        }
        var obj1 = new A('漩涡鸣人')
        var obj2 = new A('宇智波佐助')

原型2.png 分别调用返回值为都为true,说明原型对象上的属性和方法可以被实例共享。