原型以及原型链,作用域及作用域链!

193 阅读3分钟

一.原型以及原型链

- 1.何为原型?

在javascript里面,每当我们定义一个对象的时候,对象中会包含一些定义好的属性,其中有一个prototype,这个属性指向函数的原型对象,使用原型对象的好处是,对象在实例过后可以共享它里面包含的属性和方法。

显示原型隐式原型
用来实现基于原型的继承与属性的共享用来构成原型练,实现基于原型的继承

- 2.何为原型链?

每一个对象都会有一个原型对象,通过proto指向它的原型对象,并且继承他里面的方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终通过Object.prototype._proto_指向null,这种关系被称为原型链,通过原型链一个对象可以拥有定义在其他对象中的属性和方法.

当查找一个对象的属性时,javascript会根据原型链向上遍历对象的原型,直到找到给定的名称的属性的名称为止,如果到达原型链的顶部仍然没有找到指定的属性,就会返回undefined

- 3.prototype和proto的区别是什么?

  1. prototype是构造函数里面的属性
  2. _proto_是每个实例都有的属性,可以访问prototype属性
  3. 实例的_proto_与其构造函数的prototype指向的是同一个对象

原型链查找流程图 (function创建一个类 实例化这个类为p1,添加一个play方法,查找play方法)

看是否有该方法-->有的话直接调用-->没有的话使用p1.proto查找-->有的话调用-->没有的话使用person.prototype-->有的话调用-->没有的话使用person.prototype.proto-->有的话调用—->没有的话使用object.prototype-->有的话调用-->没有的话使用object.prototype.proto-->这就是最顶层了,再找不到就直接是null了,是原型链的顶级.

原型和原型链的区别

原型是为了实现对象间的联系,解决构造函数无法共享而引入的一个属性

原型链是一个实现对象间联系即继承的主要方法

二.作用域以及作用域链

- 1.何为作用域?

作用域就是变量和函数的可访问范围

名称作用
全局作用域定义在window的变量,任何地方都可以访问
局部作用域只在函数内部定义的变量范围
块级作用域let const就被认为是块级作用域的变量 for循环里面定义的let if里面用let定义的变量

注:尽量不要使用全局变量会有 1.全局污染 2.命名冲突 3.不易查找bug

1.何为作用域链?

由最内部的作用域往最外部,查找变量的过程,形成的链条就是作用域链

注:作用域链找到的最外层一直找到的就是window