2.原型和原型链的关系以及查找顺序
原型:
- 当创建一个函数的时候,函数自身会有一些属性的方法,其中有一个属性叫 prototype,它就是原型。
- 只要是函数(非箭头函数)都有原型
- 原型是解决性能问题的。
- 构造函数的原型,只有它的实例化对象可以使用。
对象、类、函数:
- 对象: JS 中,万物皆对象
- 类:定义一个类
class Person {}
。子类使用 extends 来继承class Child extends Person {}
,使用 New 来创建实例let example = new Child
- 构造函数:定义一个构造函数
function Person() {}
。一个函数可以用 prototype 来继承另一个函数,详情看 继承 。使用 New 运算符来创建实例let example = new Child
。 - 函数的三个角色:1. 函数 2. 对象 3. 类
查找一个对象下,某个属性的过程:
- 实例化对象上没有。还会(通过自身的原型链)找到构造函数的原型。
- 如果还没有,会(通过构造函数的原型链)找到Object的原型为止。
- 再没有就是(undefined),函数(报错)。
注意:永远三步走,自身 -> 构造函数的原型 -> Object的原型
实例化对象的原型链 === 构造函数的原型
function fn() {
//a = 2;
//this.a = 1//原型中的this给它的实例用。return的默认返回值是this
}
let f = new fn;
Function.prototype.a = 3;
Object.prototype.a = 4;
console.log(f.a);//4
//f 自身没有 a 通过原型链(__proto__)找到构造函数 fn 的原型(prototype),
//fn 也没有变量 a, 通过原型链找到 Object 的原型,Object 的原型上的 a=4
//(第三步的时候一定会找到 Object 的原型)
console.log(fn.a);//3