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