原型链并没有那么复杂(图)

先看个例子:

 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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值