大一菜鸟JavaScript学习之路(三)原型与原型链

225 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。


原型

定义原型

  • 原型实际上就是一个普通对象,继承于Object类
  • 原型由JavaScript自动创建并依附于每个函数身上
  • 可以通过function.prototype访问和操作对象。
function P(x){
  this.x = x;
}
P.prototype.x = 1;

访问原型

  • 访问原型对象有三种方法(obj表示实例对象)
  1. obj.proto

    1. 是一个私有属性,可读可写,可以访问实例的原型对象
  2. obj.constructor.prototype

    1.   先用constructor访问构造函数,再用prototype访问函数的实例对象
  3. Object.getPrototypeOf(obj)【推荐】

    1. _proto_是私有属性,存在浏览器兼容问题。
    2. 若constructor属性值被覆盖,则第二种方法会失效

设置原型

  • 设置对象有三种方法(obj表示实例对象,prototypeof表示原型对象)
  1. obj.proto=prototypeObj
  2. Object.setPrototypeOf(obj,prototypeObj)
  3. Object.create(prototypeObj)

检测原型

  • isPrototypeOf方法,判断该对象是否为参数对象的原型。
  • isPrototypeOf是一个原型方法,可以在每个实例对象上调用。
var F = function(){};
var obj = new F();
var proto1 = Object.getPrototypeOf(obj);
console.log(proto1.isPrototypeOf(obj));
//true

原型属性

  • 原型属性可以被所有实例访问,而私有属性只能被当前实例访问。

  • 如果给构造函数定义了与原型属性同名的私有属性,则私有属性会覆盖原型属性值

  • 如果使用delete运算符删除私有属性,则原型属性会被访问。

原型链

  • 在JavaScript中,实例对象在读取属性时,先检查私有属性,如果存在,则返回私有属性。否则就会检索prototype原型,若找到同名属性,则返回prototype原型的属性值。
  • prototype原型允许引用其他对象。如果在prototype原型中没有找到指定的属性,则JavaScript会根据引用关系,继续检索prototype原型对象的prototype原型。