js 构造函数、原型对象、实例对象

287 阅读2分钟

1、构造函数的显式原型等于实例对象的隐式原型

原理: 实例对象.__proto__ = 构造函数.prototype // 在new 的时候,给实例对象添加了这行赋值

1.1 构造函数:

     1.1.1 有prototype(显性原型属性)属性,指向原型对象

     1.1.2 如果作为实例对象,则是通过new ...()出来的,则会有__proto__(隐性原型)指向原型对象

1.2 原型对象:除了Object的原型对象外,其他的构造函数初始产生的原型对象都是空的 Object对象,也就是 原型对象 = {}

     1.2.1 有construct属性,指向构造函数;

     1.2.2 如果是作为实例对象,则是通过new xx()有__proto__属性指向xx原型对象

1.3 实例对象:

    1.3.1 通过new xx()出来,有__proto__属性指向原型对象

1.4

     1.4.1 function A () {} // 等于 var A = new Function() , Function函数也是new Function()来的,A 既作为构造函数,也作为实例对象(通过new Function())

     1.4.2 A.prototype (原型对象):初始都是空的对象 {}

     1.5 属性:实例对象只能获取自己或者原型链上的属性,获取不到构造函数中的属性

            function A () {

               var a = 123; // 这样定义代表是构造函数中的属性,类似于“类”中的静态属性

               this.b = 456; // this代表实例对象,这样代表实例中的属性

             }

             A.prototype.c = 789; // 原型对象的属性

              var a = new A() ;

              console.log(a.a) // 获取不到构造函数中的属性值

              console.log(a.b) // 可以获取自己的属性

              console.log( a.c) // 可以获取到原型链上的属性

1.6 instanceof : 判断a是不是A的实例对象

      例: a instanceof A // 因为a是new A()得到的,所以a.__proto__==A.prototype,返回true

       判断的依据是:实例对象在原型链上指向的原型 = 构造函数指向的原型

       也就是: 实例.__proto__(可以查多级) = 构造.prototype

        例: Object.prototype instanceof Object // false

        // 因为Object.prototype.__proto__ == null // 实例的__proto__指向null

         Object.prototype == 对象 // 构造函数的prototype指向对象,所以这两个不相等

        例:Object instanceof Object // true

        // 因为Object = new Object() 来的, 所以实例Object.__proto__ == Object(构造函数).prototype