原型与原型链

饥人谷_RzhiPeng 关注

2019.03.16 18:17 字数 1194 阅读 11评论 0喜欢 0

ECMAScript 规定全局对象叫做 global,但是浏览器把 window 作为全局对象(浏览器先存在的),window 就是一个哈希表,有很多属性。window 的属性就是全局变量。

window中有一些是ECMAScript规定了的函数:Number、String、Boolean、Object。

用这些函数声明变量一般都有两种形式,以Number为例:

1)Number('1')2)varn=newNumber(1)

上述两种方法可以用Number()来构造一个对象,这里构造处理数值1对象,与普通数值是有不同的。

varn1=1;varn2=Number('1');

n1和n2虽然数值都是1,但n2的类型属于'object',n1则为'number',身为基本类型number的n1直接指向了数字1,而n2指向了一个地址,这个地址中存放了数值1,这就是对象和基本类型的区别。

n2中有属性toString是对象默认存在的,但数值类型的n1也可以调用toString属性,那是因为调用n1.toString时,系统生成了一个临时对象,而这个对象中就有toString这个属性供n1调用,不够调用后系统立马删除了这个临时对象。所以会有以下一个情况:

n1.xxx=1;console.log(n1);//undefined

因此引申出了一个共用对象的概念,大致是因为所有对象都有toString()和valueOf()属性,如果每个对象中都存放太占内存,所以专门用了一块空间来放置这些共用属性,当对象需要使用时可以直接调用。在声明对象时,会默认产生一个隐藏属性'proto',这个属性存放的地址指向了对象的共用属性。于是就有了下面这个情况:

varo1={},o2={};  o1===o2// falseo1.toString === o2.toString// true

对象有属于对象的共用属性,其他几个函数也有各自的共用属性,但要怎么将他们联系起来呢?那就要说到大家常说的一句话了,js中一切都可以看作是一个对象!

也就是说所有的类型都可以调用对象的共用属性,但中间会存在一层关系:

varn1=1;

n1.proto===Number的共用属性,Number的共用属性也是一个对象,所以它里面存在一个隐藏属性__proto*__指向了对象的共用属性。这也是前面有说number类型的n1能调用toString的基本原理了。

而对于共用对象来说是独自存在于内存中的一块空间,并不归某个具体的对象或者变量所属,但是如果没有被引用的话是会被系统垃圾回收的,故而引申出了一个prototype属性,前面提到的:Number、String、Boolean、Object四个函数都具有这个默认属性,而这个属性指向正是指向他们的共用对象,保证共用对象不被垃圾回收。

看到这里会发现'proto'和'prototype'很像,都是指向共用属性,但其实他们的意义是不同的,区别在于'prototype'一直存在与window中(即使没有写任何代码),防止共用属性被回收,它是函数的属性;'proto'则是当声明了对象后才存在与对象中,并引用prototype所指向的共用属性,它是对象的属性,基本关系可以通过下图来理解:

image.png

它们之间存在一种引用关系,这种引用关系形成了一个链条,这就是我们标题所说的原型链,原型的话就是这些共用属性了。

可以发现所有的原型链最终都指向了Object的共用对象,而Object的共用对象本身也是一个对象,它也有隐藏的'proto'属性,但与其他'proto'属性不一样,这个指向的是null。

升级一下:

var 对象 = new 函数对象 这个声明形式可以引申出:

对象.proto ===构造函数.prototype(本身也是个对象),下面是次关系衍生出的关系:

函数.proto ===Function.prototype

Function.proto === Function.prototype

Object.proto === Function.prototype //Objec也是个函数,函数都是由Function构造出来的。

Number.proto === Function.prototype

构造函数.prototype.proto ===Object.prototype

Function.prototype.proto ===Object.prototype

Number.prototype.proto ===Object.prototype

Object.proto .proto ===null

理解了以上的关系后,'proto'是对象的属性、'prototype'是函数的属性这句话也就懂了。

以上。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容