原型与原型链

原型

原型是公有属性的收拢,对象默认拥有属性__proto__,所有对象的最终原型为Object.prototype

Object.__proto__

原型链

原型链以null为根,延伸至对象的公有属性(例如Object.prototype),重复直至达到某个自定义对象,整个链条延伸下来,就是一条原型链。几乎所有 JavaScript 中的对象都是位于原型链顶端的Object的实例。

Object.__proto__ === Function.prototype

Function.__proto__ === Function.prototype

Object.prototype.__proto__ ===null 因为Object.prototype没有更多公有属性了

JavaScript 对象是动态的属性“包”(指其自己的属性)。JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。

this

this是 JavaScript 语言的一个关键字。

它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。

function test() {
 this.x = 1;
}

上面代码中,函数test运行时,内部会自动有一个this对象可以使用。

原型继承

但是由上面test函数生成的实例对象,无法共享属性和方法。每个对象属性是独立的,修改一个另一个不变化,每一个实例对象,都有自己的属性和方法的副本。这不仅无法做到数据共享,也是极大的资源浪费。
这时需要引入prototype属性。这个属性包含一个对象(以下简称"prototype对象"),所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面。
实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。
由于所有的实例对象共享同一个prototype对象,那么从外界看起来,prototype对象就好像是实例对象的原型,而实例对象则好像"继承"了prototype对象一样。

推荐阅读更多精彩内容

  • 当满腹的牢骚 脱口而出的时候 我甘当精神的垃圾桶 悲愤和痛苦需要一个出口 为何让那积蓄的压抑和愤懑 怄出冲天臭气 ...
    叶下诗人阅读 40评论 1 2
  • 夜晚, 呼吸着那一片漆黑与蔚蓝 近的遥远 恬淡 如月的光圈 似温暖,却又清冷的可怜 呼唤 呼唤 回应的只是呼喊后的...
    宠儿小雨点阅读 5评论 0 0
  • 今天大年三十,一年一度的春晚是不能错过,中午又是朋友与长辈聚餐,明天会上山去看父亲,已经把要给他的两封信...
    李宜和阅读 27评论 8 6
  • 我总觉得我也会像许多人一样,在一天遇见那么一个人,一见面便如前世见过无数面,共同在佛前许下过心愿,穿过时间的洪流,...
    秋沐殇阅读 27评论 0 1
  • 作者:魏和祥 一、建筑企业必须为工人买工伤保险 按照《建筑施工企业农民工参加工伤保险试行办法》,建筑施工企业应为本...
    一路筑服阅读 32评论 0 0