什么是原型:前端
1,咱们所建立的每个函数,解析器都会向该函数对象添加一个属性prototype,这个属性指向一个对象,这个对象就是咱们所谓的原型对象函数
2,若是咱们将函数做为普通函数调用时,prototype基本没有任何做用;当函数做为构造函数使用时,构造函数所建立的对象中都会有一个隐含属性,这个隐含属性指向建立它的构建函数的原型对象(好像有点绕……),咱们能够经过__proto__来访问该属性spa
3,原型对象就至关于一个公共的区域,全部同一个类的实例均可以访问到这个原型对象(咱们能够将对象中共有的内容,统一设置到原型对象中)prototype
使用方法或者属性时的一个内部查找顺序(有必要知晓):对象
(1)当访问一个对象的属性/方法时,首先查找这个对象自身有没有该属性blog
(2)若是没有就查找它的原型(也就是__proto__指向的构造函数prototype原型对象)原型链
(3)若是尚未找到就查找原型对象的原型,就是prototype.__proto__,它应该是指向Object构造函数的原型对象-我理解为原型对象是由Obejct这个构造函数建立的原型
(4)依次类推,若是尚未,则它会查找Object构造函数原型的原型,也就是Object构造函数的prototype.__proto__,若是打印它,你会发现它是nullio
原型链:构造函数
ps:有没有以为很像一个链条呢
总结:
咱们这里须要重点知晓的是,原型对象也是对象,是对象就是用构造函数建立出来的,而最终他们都指向Object的构造函数的原型对象的原型对象,也就是null;事实上,咱们能够把Object构造函数当作是一切对象的祖先(包括Function构造函数,它的__proto__也是指向Object),还须要知晓Js内部查找属性和方法的一个规则,熟知这些,那么理解原型和原型链就没什么难度了
嗯嗯……,写的好像有点乱,若是有大佬发现此文中的错误,能够指正出来,毕竟才接触前端没多久,只是我的对原型的一些总结和理解,若是后续有更深刻的理解或有更简洁的描述,会再进行补充或修改