先看个例子:
var Animal = function(){};
var Dog = function(){};
Animal.name = 'animal';
Dog.prototype = Animal;
var tidy = new Dog();
console.log(Dog.name) //undefined
console.log(tidy.name) // animal
执行Dog.name,虽然prototype指向的animal有这个属性,但它并没有去沿着这个“链”去寻找 (原型链的形成是真正是靠__proto__ 而非prototype)。
执行tidy.name的时候,也没有这个属性,但是__proto__指向了Animal,它会沿着这个链去寻找,Animal中有name属性,所以tidy.name输出。
上一个图
结合 new 做的三件事简单说一下这个流程
1、创建空对象
2、__proto__指向构造函数的 prototype
3、改变this指向该实例。
这就是new实例的过程,它并不是fn.prototype.__proto__ === Foo.prototype,而是fn.__proto__ === Foo.prototype。
这时从下到上才有了 __proto__ 的链式查找,形成原型链。
-----------------------------------------------------
var a = new A();
这里面有2条原型
1、a.__proto__ === A.prototype ===> a.__proto__.__proto__ === Object.prototype
意思是:A.prototype.__proto__ === Object.prototype
2、A.__proto__ === Function.prototype
-----------------------------------------------------
疑点解释:
1.Object.__proto__ === Function.prototype // true
Object是函数对象,是通过new Function()创建,所以Object.__proto__指向Function.prototype。
2.Function.__proto__ === Function.prototype // true
Function 也是对象函数,也是通过new Function()创建,所以Function.__proto__指向Function.prototype。
3、同样 Array是通过new Function()创建, Array.__proto__ === Function.prototype
4、Function.prototype.__proto__ === Object.prototype //true 万物皆对象
注意Object.constructor===Function;//true 本身Object就是Function函数构造出来的
-----------------------------------------------------
原型对象prototype中都有个预定义的constructor属性,用来引用它的函数对象。这是一种循环引用
person.prototype.constructor === person //true
Function.prototype.constructor === Function //true
Object.prototype.constructor === Object //true
有两点需要注意:
(1)注意Object.constructor===Function;//true 本身Object就是Function函数构造出来的
(2)如何查找一个对象的constructor,就是在该对象的原型链上寻找碰到的第一个constructor属性所指向的对象
参考:https://www.cnblogs.com/LiuB/p/6050998.html