原型、原型链

113 阅读5分钟

1.基础

Js对象:

本质上都是通过new函数创建的,包括对象字面量的形式定义对象(相当于new Object()的语法糖)

Js函数:

本质上都是通过new Function创建的,包括Object、Array等

Js所有的函数都是对象

2.概念

2.1类:是创建对象实例的模板

本质上讲类是个函数 (例如Array object String )

2.2构造函数:

  是什么:函数
           用new来执行的函数
           一种特殊的函数,主要用来初始化对象
  作用:封装
          把对象里面一些相同的属性和方法抽象出来封装到函数里面
  功能:主要用于在类的对象创建时定义初始化的状态
  调用:new 构造函数名();
  

image.png

语法格式:

语法格式.jpg

注意点:
  • 构造函数名字首字母要大写
  • 构造函数名字不需要return就可以返回结果
  • 调用构造函数必须使用new
  • 只要new xxx( )调用函数就创建一个对象{ }
  • 属性和方法前面必须加this
    方法调用示例:

image.png

构造函数和对象的区别:
  • 构造函数实际上是一个泛类,对象是一个具体的事物(泛类表示类中有一个未知的类型)
  • 我们利用构造函数创建对象的过程也称为对象的实例化,即实例对象
构造函数和函数的区别:

唯一不同就是调用它们的方式不同

  • new调用:this指向对象
  • 不用new调用:this指向window
new关键字的执行过程
  • new关键字可以在内存中创建了一个空的新对象
  • this就会指向刚才创建的空对象
  • 执行构造函数里面的代码,给这个空对象添加属性和方法
  • 返回这个对象
遍历对象属性for…in…

可用于对数组或者对象的属性进行循环操作

image.png

缺点

浪费内存

构造函数中的函数多次创建,占用内存

2.3实例对象

是什么
  • 通过构造函数使用 new 关键字创建的对象
  • 由类创建的对象
  • 本质上就是对象
作用

这个新对象就会从构造函数的原型对象中继承属性和方法

image.png

形式

var car1=new Car("red","BMW")car1就是实例对象

vue实例

类似于创建一个对象,是一个vue构造函数的实例对象。里面包含钩子函数data、methods、components等

Js实例
js中所有对象都是Object的实例

因为Object是一个基本对象类型,其它所有对象都从object继承了基本的行为

image.png

js中所有函数都是Function的实例(包含内置构造函数)

Object、Array、Date、Function、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError、Boolean、Number、String都是内置构造函数 image.png

Object是内置的构造函数,用于创建普通对象
  • Object.keys():获取对象中所有属性(键)
  • Object.value(): 获取对象中所有属性(值)
  • Object.assign():用于对象拷贝
内置构造函数
含义:
  • 内置(就是js本身就自带)
  • 构造函数(本质上就是一个函数,构造函数就是用来创建对象的)
  • 内置构造函数(js内部提供了一个用来创建对象的函数)
如何通过内置构造函数创建对象

let 对象名=new Object();

分类
  • 引用:Object Array RegExp Date等
  • 包装:String Number Boolean等
js中所有手动创建的对象都是对应类型的实例,同样也是Object的实例

image.png

如何检测

instanceof操作符

  • 该操作符能确定左侧的对象是否是右侧类的实例,返回一个Boolean值
  • 若检测基本类型则返回false,因为基本类型不是对象

2.4原型对象

JavaScript规定,每一个构造函数都有一个prototype属性,指向另一个对象,所以我们也称为原型对象

image.png

作用

原型对象可以挂载函数,对象实例化不会多次创建原型对象里面的函数,节约内存

3.原型

3.1类别
显示原型prototype
  • 一个普通的Object对象
  • 实例的原型
  • 每一个类(构造函数)都有一个显示原型prototype
隐式原型_proto_
js所有实例对象(除了null)都具有的一个属性

image.png [[prototype]]就是_proto_

实例对象的_proto_属性指向了构造函数的原型

f.__proto __ =Fo.prototype

632790888909157157.jpg

image.png

3.2constructor属性

constructor属性在哪

每个原型对象中都有constructor属性

image.png

由原型对象指向构造函数的一个Js属性

Fo.prototype.constructor–>Fo

image.png 经常用它给构造函数追加属性和方法

708312753662173533.jpg

4.原型链

4.1概念
  • ①当访问一个对象成员(属性/方法)时,首先查找这个对象自身有没有该成员(属性/方法)
  • ②如果没有就查找它的原型对象(也就是_proto_指向的prototype原型对象)
  • ③如果还没有就查找原型对象的原型对象(Object的原型对象)
  • ④依此类推一直找到Object为止( null )
  • ⑤原型链就在于为对象
4.2图解

image.png

5.作用

  • 实现了Js的继承
    • class的extends方法
    • 继承原型链
  • 实现了实例的公用属性和方法( 实现类的实例方法扩展)
6.三张图了解原型和原型链

image.png

image.png

image.png

题外话
hasOwnProperty

hasOwnProperty 用来判断是否是对象自身的属性(非原型链继承过来的

873634623904546300.jpg

in

in用来检查对象是是否包含某个属性(包含原型链上的属性)

252937022151669041.jpg