js原型对象和原型链理解

参考:https://blog.csdn.net/yucihent/article/details/79424506
文章内的图是参考一个大神的 但是找不到链接了

一. 函数对象

  • 所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)
  • 所有函数拥有prototype属性(显示原型)(仅限函数)
  var a = {};
  console.log(a.prototype);      //undefined
  console.log(a.__proto__); 	//Object{}

  var b = function(){};
  console.log(b.prototype); 	//Object{}
  console.log(b.__proto__);	//function(){}
  由上述代码可知,prototype是函数才有的属性
  • 原型对象:拥有prototype属性的对象,在定义函数时就被创建
  • 原型对象的结构:
Function.prototype ={
		constructor:Function,
		__proto__ : parent prototype,
		some prototype properties:	
	};

二. __proto__属性指向

__proto__属性指向取决于对象创建时的实现方式

方式一:字面量方式

var a = {};
在这里插入图片描述

方式二:构造器方式

var A = function(){};
var a = new A();

在这里插入图片描述

方式三:Object.create()方式

var a1 = {};
var a2 = Object.create(a1);

在这里插入图片描述

> 大多数情况下,__proto__可以理解为“构造器的原型”,即__proto__ ===  constructor.prototype
>(实例的隐式原型指向它构造函数的显示原型  这里的指向即恒等于)

这句话的理解可参考以下文章中的图
https://blog.csdn.net/qq_43553067/article/details/88075690

三: 原型和原型链

  • 什么是原型链?

    由于__proto__是任何对象都有的属性,而js万物皆对象,所以会形成一条__proto__链接起来的链条,递归访问__proto__必须最终到头,并且值是null
    当js引擎查找对象的属性时,先查找对象本身是否存在属性。如果不存在,会在原型链(其构造函数的prototype)上查找

  • 示例

    var A = function(){}
    var a = new A();
    
  • 如图所示在这里插入图片描述

     - a.__proto__  ——> A.prototype(构造器function A 的原型对象)
     - a.__proto__.__proto__  ——> Object.prototype(构造器 function object的原型对象)
     - a.__proto__.__proto__.__proto__ ——> null
    
  • 示例:

    Function.prototype.a = "a";
        Object.prototype.b = "b";
        function Person(){}
        console.log(Person);   	//function Person()
        var  p = new Person();
        console.log(p);        	//Person {} 对象
        console.log(p.a);      	//undefined
        console.log(p.b);       //b
    
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值