原形还是原型?

2022-12-28 0 350

本系列产品文须要很大js此基础,适宜听众:介绍蓝本与蓝本链,但不明晰。

先放出两个推论,

__proto__ 是 代之,prototype 是 蓝本 ,代之 和 蓝本 相同,代之 是两个操作符,而 蓝本 是两个实体

假如你能看清楚这句话,所以这首诗你不必看了。

我们假如都玩过王者荣耀,那时他们阔蕊两个缔造王者荣耀英雄人物的操作过程来传授呵呵蓝本与蓝本链。 具体来说他们先表述两个缔造英雄人物的方式:

var Hero = function(name, props) { this.name = name // 英文名字 this.props = props // 特性 }

挺单纯的,不必多说明了。

接下去缔造两个英雄人物,英文名字叫阿珂吧。

var ake = new Hero( ake, { hp: 100, mp: 0, } )

再缔造几个英雄人物吧,刘备,典韦之类的,也是类似的。

var dianWei = new Hero(dianWei,{ hp: 500, mp: 20, }) var liuBei = new Hero(liuBei,{ hp: 1000, mp: 100, })

实际上,早期的JavaScript就是用这种构造函数方式来模拟“类”的行为。

接下去,让他们来看呵呵 prototype 和 __proto__ 吧。

prototype

此时,所有的英雄人物就构造完成了,但是,所有英雄人物都有回城技能,所以该如何添加呢?总不会两个两个英雄人物去修改吧? 他们观察,以上英雄人物均有相同的特点,即两个英文名字加两个特性,所以在缔造这些英雄人物的操作过程中是否存在着两个参考呢?或者说两个模板?是的,这就是 prototype ,也就是真正的蓝本,我更愿意将其称之为母体。

所有由母体克隆而出的复制体,都是基于母体的,因此也会拥有母体所具有的特征。 例如,男程序员和男产品经理都是来自于男性,因此,假如有一天国家规定所有男性必须穿裙子,所以男程序员和男产品经理必不可免的要穿上裙子。

所以,问题其实就很单纯地解决了,只须要让英雄人物们的母体具有回城功能就可以了。

Hero.prototype.goHome = function() { // 回城 }

__proto__

新手们看到这段代码通常会很迷惑,通常会发出如下的疑问:

等等!我学过这里,prototype不是蓝本的意思吗?你这样不是修改了Hero的蓝本吗?也不就是修改了Hero的母体吗? ake来自于Hero,你假如这么写 Hero.goHome = function() { … }才对!

这就是那时的重点, 蓝本 和 代之 之争。 实际上 prototype 和 __proto__ 经常容易搞混,这是因为虽然prototype翻译为 蓝本 ,但我们经常会把它错误地按照 代之 的意思理解。

看过EVA的朋友们很大会知道零号机和二号机,EVA中,政府基于零号机缔造出了一系列产品的机器人,分别取名为二号机,三号机,N号机,实际上归纳为一句话就是

二号机的 代之 是 零号机

这句话中, 代之 就是 __proto__ ,而零号机就是 prototype,用代码来表示就是

二号机.__proto__ === 零号机 // 二号机的 代之 是零号机 机器人.prototype === 零号机 // 机器人的 蓝本 是零号机

再来说说,新手的写法为什么错误。 Hero实质上是两个类似于构造器一样的东西,两个加工工厂,对工厂做任何改动不会对产品产生影响,假如想要改动所有的产品,当然要对模具进行改动。

这么说来,就一切都说通了,因此他们可以得出——

一系列产品推论

实例没有缔造其他东西的能力,所以它很大没有 蓝本然而构造函数来自于Function,所以它很大有 代之 (玩具工厂也是一种工厂)

所以 – 构造函数的 代之 就假如是Function的 蓝本

让他们来验证呵呵,

ake.prototype // undefined Hero.__proto__ === Function.prototype // true

结果符合的非常好。

Function

他们知道,所有的函数都来自于Function,那Function又来自哪里呢?答案是:来自V8引擎内部。

为了让Function也符合函数的特征,js强行规定了Function.__proto__ === Function.prototype。

Object

他们又知道,对象最终都来自于Object,也就是说沿着__proto__追溯,最终总会到达Object.prototype, 然而问题来了,Object.prototype的代之是谁呢? 答案是:null,不存在

是的,道生一,一生万物。

一些有趣的推论

基于以上推论,他们会得到一些很好玩的事情,例如:

Object.__proto.__proto指向什么呢?

让他们来分析呵呵,Object实质上也是两个构造函数,所以它假如也来自Function,没错,Object.__proto__指向的就是Function.prototype。

问题转化为

Function.prototype.__proto__指向什么呢?

看了上面的分析之后,Function.prototype显然是两个对象,所以问题就是两个对象的蓝本是什么。 答案很显然,

Object.prototype

让他们来验证呵呵,

Object.__proto__.__protp__ === Object.prototype // true

蓝本链

蓝本链也很单纯,基本呼之欲出了。 举个例子,假如你想知道一个男前端是否会跑步,虽然答案显然可见,不过你也可以这样想:

男前端是两个男人, 男人是人类, 人类都会跑步。

这就是蓝本链。 当你不确定两个对象是否拥有一种特性或者方式的时候,你可以向上去寻找它的代之(__proto__)。直到找到Object为止。

所以蓝本链传下来的方式与特性,为什么不在对象中直接表示出来呢? 再次回到王者荣耀,现实中,他们在描述两个英雄人物的时候,一般也都会说它的独特技能,而不会说它会回城,对不对?

后续还有Constructor等内容,未完待续

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务