原型和原型链随笔

288 阅读2分钟

原型原型链

1、函数的prototype

1.每个函数都有一个prototype属性 ,默认指向一个object空对象(原型对象); 2.原型对象中有一个属性construction,指向函数对象;

<script type="text/javascript">
​
  // 每个函数(例如Data函数)都有一个prototype属性, 它默认指向一个Object空对象(即称为: 原型对象)
  console.log(Date.prototype, typeof Date.prototype)
  function Fun () {//alt + shift +r(重命名rename)
​
  }
  console.log(Fun.prototype)  // 默认指向一个Object空对象(即没有我们自定义的属性)
  <script/>

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

2.任意函数的原型对象的构造器指向函数对象

     // 任意函数的原型对象中有一个属性constructor, 它指向函数对象
  console.log(Date.prototype.constructor===Date) //true
  console.log(Fun.prototype.constructor===Fun)//true

3.构造函数和原型对象相互引用

1.函数 Type的prototype属性指向 Type的原型对象object 2.Type原型对象(Type.prototype)的constructor构造器指向函数 Type

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

4. 给原型对象添加属性(一般是方法)

作用:函数的所有实例对象自动拥有原型中的属性(方法) 可以给原型对象增加自定义属性(一般是方法) 通过函数.prototype.自定义函数=function(){} 的方式进行增加

 //给原型对象添加属性(一般是方法) ===>实例对象可以访问
  Fun.prototype.test = function () {
    console.log('访问了test()')
  }
  var fun = new Fun()
  fun.test()

5.显式原型和隐式原型

函数的prototype 指的是函数的显式原型

每一个实例对象都有一个 ****proto___ 属性 ,称为隐式原型

实例对象隐式原型的值为其构造函数的显式原型的值

function Fun () {
   // this.prototype = {}
}
console.log(Fun.prototype) //函数的显式原型 默认也是指向一个空的object
//创建实例对象
let fun  = new Fun()
//this.__proto__ = Fun.prototype
console.log(fun.__proto__) //实例的隐式原型
console.log(fun.__proto__  == Fun.prototype ) //true
//给原型添加方法
Fun.prototype.test = function (){
    console.log('123123')
}
//通过实例对象调用方法
fun.test() // 123123

image-20210926141645763.png

6.原型链

image-20210926144218516.png

image-20210926144407594.png 构造函数的显示原型和实例对象的隐式原型相等

所有构造函数的隐式原型都是一致的 都是Function.rototype

image-20210926150144078.png

image-20210926150154936.png

image-20210926150329479.png

\