JavaScript - Prototype

背景

刚一直在研究 JavaScript 的 Decorator 模式。然后好多教程不约而同的提到了 Object.defineProperty(),有的还提到了 prototype。接着再查询,就几乎都指向了 prototype。而我现在全栈都在使用 JavaScript,无论是想提高 JavaScript 的水平,还是能看懂其他关于 JavaScript 的资料,看来这个 prototype 的原理是不能了解的了。

题外话

刚才就这个 prototype 的问题在 Google 上查找了很多资料,阮一峰的、MDN 的,还有其他不知名的中文博客。MDN 的资料一板一眼,像是标准的教科书;其他中文博客则毫无章法的乱说一通,草草用生硬晦涩的文字说了一下 prototype 的定义,然后就大篇幅的讨论怎么用,怎么好;而阮一峰的文章则从 JavaScript 的由来、开发 JavaScript 时遇到的问题以及如何解决的阐述了 prototype 的定义、由来和目标。可以说全文绝大篇幅都在分析 JavaScript 的历史,只用了一点点的笔墨写了几个简单的函数,就把 prototype 的来龙去脉全部讲清楚了。
阮一峰的思路正应了最近刚刚领悟到的看事物,要看这个事物从哪儿来,到哪儿去的精髓。“从哪儿来”就是为什么要搞出来这个 prototype,当时是什么环境,遇到了什么问题;“到哪儿去”就是这个 prototype 通过什么方式解决的这个问题,是否还留下了什么问题。想了解事物的本质,不明确事物身处的环境而架空了光谈事物的功能,只能引人走向歧途。好比我是一个 100 年前来的古人,看到了现代的洗衣机,我就会问这个是什么啊,如果有人给我解释说这个洗衣机能洗衣服,还能甩干衣服。那我接着就会想,那应该也能洗澡吧,洗个土豆啥的也行。但如果有人分析说是因为某发明公司发现人类手工洗衣服比较累,为了解决人类手洗衣服费时费力的问题所发明的这个设备,我便彻底了解了洗衣机的本质。

Prototype 出现的背景

JavaScript 的出现

上个世纪 90 年代初,网景公司刚推出浏览器没有多久。在用户使用的过程中,发现一些问题,例如浏览器上有一些内容需要用户填写,但是存在不少用户没有填写就提交的情况。这样导致用户一些明显的错误不能被及时提醒,而服务器侧又需要处理一些本来不需要处理的事务。在此情况下,网景公司需要一种网页脚本语言,可以允许浏览器和网页互动。
工程师 Brendan Eich 负责这种语言的开发。他认为由于只需要解决一些小的问题,该语言只需要提供一些简单的功能就可以。
当时,C++ 和 Java 所代表的面向对象编程思想风头正劲,Brendan Eich 也受到了很大影响。于是 JavaScript 中的数据类型都是对象。

折衷方案

JavaScript 的设计初衷是提供一个能够实现一些简单功能的语言。如果把 Java 的所有特性都加入进来的话,对于仅仅是辅助功能的脚本语言来说可能太重了。于是 Brendan Eich 没有选择引入正式的概念,而用普通函数实现了类和其构造函数的功能。

折衷方案的问题

由于没有引入类,对象之间无法共享属性和方法,对应到 Java 来说应该是静态属性和静态方法。导致两个问题:一是无法实现数据共享;二是资源浪费。

引入 prototype 属性

为了解决以上问题,Brendan Eich 决定为构造函数设置一个 prototype 属性。该属性包含一个对象,所有实例对象需要共享的属性和方法,都放在这个对象里面。不需要共享的属性和方法,则放入各自的构造函数中。实例对象一旦创建,将自动引用 prototype 对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。
由于所有的实例对象共享同一个 prototype 对象,那么从外界看起来,prototype 对象就好像是实例对象的原型,而实例对象则好像"继承"了 prototype 对象一样。

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

推荐阅读更多精彩内容