原型与原型链

0、预备知识

属性描述符
  • Object.getOwnPropertyDescriptor(obj,"a") 查看a的属性描述
  • Object.getOwnPropertyDescriptor(obj,"a",{ value:2, // 值 writable:false, //是否可写 enumerable:true, //是否可枚举 configurable:true //时候可配置 }); obj.a=5; console.log(obj.a); //5 注意:严格模式下,会报错,因为不可修改
  • for in 遍历可枚举属性

1、什么是原型和原型链

  • 每一个函数都具有prototype属性,它被默认成一个对象,即原型对象
  • 原型链:当对象使用属性的时候,现在自身进行查找,有就直接使用,没有就沿着__proto__这条链继续往下查找,直到找到Object原型位置,有就返回相应的值,没有就返回underfined.

2、原型在哪里使用

  • 原型对象中有两个默认的不可枚举属性:constructor和 __ proto__ ;constructor指向对象, __ proto__为隐式原型属性
  • 原型分为两种,显式原型prototype和隐式原型__ proto__

3、为什么使用原型

  • 使用prototype,对象之间通过内部的prototype属性进行关联,这种模式我们可以称之为“委托”,其实对于使用prototype,更准确的说法是——使得对象之间的关系不是复制而是委托,内部委托比起直接委托来说可以让API更加清晰。

4、查找机制

  • 对一个对象的属性进行查找时,如果其存在普通属性中,直接返回不再向下查找
  • 如果不存在普通属性中,继续向对象内部的通过prototype相关联的对象中查找
  • 这种关联实际上形成了一条“原型链”,如果在这一层找不到会继续向下查找。
  • 直到到达普通内置对象的 Object.prototype中,指向原型链的顶端
  • 如果在原型链中还是没有找到这个属性,就会停止
  • 内置对象的__ proto__为null,如果属性没有查找到,就会返回undefined.

5、查找图示

6、查找“类”关系:instanceof的使用

  • 作用:为了查找对象a委托的对象是否存在
  • 一般语法:A instanceof B,一般来说,A为对象,B为函数
  • 这段语法的意思:如果B函数的显式原型对象在A对象的原型链上,返回true,否则返回false。
  • 实例: function Foo () { } var f1 = new Foo(); console.log(f1 instanceof Foo); //true
  • 注意:这个方法只能处理对象和函数之间的关系,不能判断对象和对象之间的关系。

7、原型链图解

你可能感兴趣的:(JavaScript,JavaScript高级)