原型、原型链、构造函数、实例

133 阅读2分钟

一篇原型相关的学习笔记


1、原型、构造函数、实例

原型(prototype):

  • 一个简单的对象,用于实现对象的属性继承。可以简单的理解为对象的父亲
  • 每一个JS对象都拥有一个_proto_的属性,可以通过obj._proto_来获取该对象的原型
  • 原型对象的好处是可以让所有对象实例共享它所包含的属性和方法

构造函数:
一个可以通过new来新建对象的函数

实例:

  • 可以通过构造函数和New新建的对象叫做实例。
  • 实例通过_ptoyo_指向原型,原型通过constructer指向构造函数
  • 三者的关系:
    构造函数.prototype ----> 原型
    实例.-proto- ----> 原型
    原型.constructor ----> 构造函数

prototype和_proto_的区别:
prototype是每个函数都有的一个属性,对象没有,通过bind绑定的没有这个属性,通过这个属性来指向原型 _proto_是每一个JS对象有的(函数也是对象(null除外)),通过obj._proto_来指向该对象原型

原型链

定义:原型链是由原型对象组成,每个对象都有一个_proto_属性,指向创建该对象的构造函数的原型,_proto_将对象链接起来组成了原型链。是一个用来实现继承和属性共享的对象链

原型链属性查找机制
当查找对象的属性时,会先从实例对象上去找,如果实例对象上不存在这个属性会沿着原型链向上查找,找到输出,找不到继续找,直到找到Obj.prototype上,如果还是没有,则输出undefined

原型链属性修改机制

  • 当要修改对象的属性时,如果实例对象上存在这个属性则直接修改,如果不存在则会创建这个属性。
  • 如果要修改原型的属性时,可以通过obj.prototype.XXX来修改,但是会造成所有继承于这个对象的实例的属性值发生改变

注意: Obj.prototype没有原型,obj.prototype.proto 为null

检验属性时存在于实例上还是存在于原型上:hasOwnProperty 属性只有存在于实例中才会返回true
例:obj.hasOwnProperty('name')