原型与继承【四 __proto__ prototype 原理讲解】

知识点前瞻

  1. 在javascript里引用类型都是对象
  2. 对象是通过函数创建的(也可以是字面量的形式,但是字面量没有构造函数,也就不存在与构造函数相关的的原型链继承的问题了,但是可以通过Object.create()实现字面量的继承,这篇文章谈的都是构造函数创建的对象),而函数又是另一种对象
  3. 每个函数都有一个prototype,除了匿名函数,匿名函数只有__proto__
  4. 每个对象都有一个__proto__,除了Object,Object只有protoype

demo1 认识 函数的原型属性prototype对应的原型对象 和 原型指针__proto__

	function fun(){
		}
		var variable = {a:1}
		console.log(variable)
		console.log(fun)
		console.log(fun.prototype)

在这里插入图片描述

很明显 fun.prototype 是fun的属性,叫做原型属性,指向fun的原型对象,也就是说

函数(匿名函数除外,匿名函数只有__proto__)包含了这两个基本属性 一个原型属性prototype 一个原型指针__proto__

原型属性prototype 指向原型对象

原型指针__proto__ 指向他的构造函数的原型对象

再来看一下原型对象里面含有什么东西

constructor 指向当前函数 不止构造函数有constructor,所有的函数(匿名函数除外)都有constructor,默认这个constructor指向这个函数本身(Object的constructor指向Function)

在这里插入图片描述
在这里插入图片描述

再来看原型指针__proto__

在这里插入图片描述

换句话说 函数创建的对象的原型对象的原型指针__proto__指向的对象就是Object的原型对象

验证

	function fun(){
			
		}
		fun.prototype.a="我是函数fun这个对象的原型对象的属性a"
		let f1 = new fun();
		console.log(f1)

在这里插入图片描述

这个箭头fun表示函数fun的实例

顺带说一句构造函数和函数的区别在于new关键字 用了new 就是构造函数,不用就是普通的函数,因为构造函数需要生成实例,而普通的函数只需被调用就行了,new 关键字的作用在于改变this指向,让当前构造函数的this指向创建的实例,有点call apply的感觉

再看看 fun的实例的展开

在这里插入图片描述

所有的对象都有一个__proto__,指向他的构造函数的原型属性prototype指向的原型对象

这个__proto__就是指向了fun这个函数的原型对象

函数的原型对象起码有两个属性

constructor 和 _ proto_

constructor 指向函数本身

__proto__指向他的构造函数的原型属性prototype的原型对象

函数来源于Object,所以函数的__proto__指向Object.prototype(其实中间经过了Function转了一道)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值