原型和原型链

2022-12-15 0 879

译者:timCope

序言

以后许多讲蓝本的该文单厢有斜线图,看的我是呼吸困难头昏的,此次我期望能透过单纯的文本,让他们都能全盘全盘认知蓝本和蓝本链,都晓得尽管JavaScript和Java英文名字类似于,但三种全然没联络。当中就主要包括Java中很关键的类,在JavaScript中是没类的基本概念的,为的是F83E43SeJavaScript采用了蓝本和蓝本链的方式同时实现了承继。先期ES6面世了class的句法糖,但其本质上是对象,能称作regardless。regardless是仿效如前所述类的词汇,透过内部结构器表达式造成第一类。因此那时的故事情节他们就从缺省已经开始讲起。

原型和原型链

缺省

甚么是缺省

缺省和一般表达式的差别除数人明确规定的重新命名第两个字母小写以外,最核心理念的差别是是不是采用new运算符

function Person (name,age){ this.name = name this.age = age }

下面的表达式实际上是两个一般的表达式多于当那个表达式被用作new 第一类的这时候才能被称作缺省。

因此为甚么透过new运算符能制造第一类呢?在new的操作方式中又历经了甚么呢?

1.在缺省颈部显式的建立两个第一类

2.将缺省的返回值Kozhikode新第一类,将原本对准window的this对准构造出的新第一类

3.返回那个第一类(如果表达式体内含有return,则分返回表达式是否是第一类)

function Person (name,age){ this.name = name this.age = age return 1 } new Person(tim,18) // Person {name: “tim”, age: 18}

如果是return非第一类则返回内部结构的第一类

function Person (name,age){ this.name = name this.age = age return {tim:18} } new Person(tim,18) // {tim:18}

如果是return第一类则返回return的第一类

缺省的作用

他们开头提到过所谓类就是用来描述事物中的属性和行为的,类的特征是由成员组成的,而属性对应的就是类中的成员变量,而方法对应的就是类中的成员方法。而他们透过缺省内部结构出来的第一类就能满足这两个要求。

function Person (name,age){ this.name = name this.age = age this.eat = function (food){ console.log(那时吃了+food) } } var tim = new Person(tim,18) var cope =new Person(cope,18)

当他们采用同两个缺省,内部结构出来的第一类,他们就会含有一些相同的属性和公用的方法,而这些所有实例都含有的属性和方法除放在缺省体内,他们也能放在表达式的蓝本上,方便实例承继。

蓝本

prototype

每两个JavaScript的表达式第一类上都有两个属性叫做prototype,翻译过来呢就是蓝本。

function Man (name,age){ this.name = name this.age = age } Man.prototype.sex = male Man.prototype.needCompanion = true var tim = new Man(tim,18) var cope =new Man(cope,18) console.log(tim.sex,cope.sex) //male male

下面的例子他们就完成了一次实例的承继,tim和cope都承继了来自蓝本上的属性sex

他们能这样说,tim和cope的蓝本就是Man.prototype那个第一类

因此那个第一类里还有甚么内容呢?他们在控制台打印一下那个第一类

{ “sex”: “male”, “needCompanion”: true, “constructor”: ƒ Man(name,age), “__proto__”: Object }

他们发现在控制台中除sex和needCompanion这两个他们自己添加的属性,prototype还有两个属性,而且这两个属性,在控制台中的颜色还是偏淡的,代表了这两个都是显式属性。

在了解了甚么是prototype的基础上他们尝试去揭开constructor和__proto__的神秘面纱

constructor

constructor翻译过来就是构建者的意思,他们能发现Man.prototype.constructor的对准就是Man那个缺省。

由于JS中的第一类其实都是指针,所有他们能发现Man和Man.prototype.constructor其实就是全然相同的

console.log(Man === Man.prototype.constructor) //true

__proto__

那个属性是用来干甚么呢?看下面的代码你就明白了

console.log(tim.__proto__ === Man.prototype) //true

实例的蓝本和缺省能透过constructor和prototype表达式能相互找到对方,因此实例怎么就可以找到实例的蓝本呢,就是透过__proto__属性找到他的蓝本,和以后返回值中的提到[[scope]]其实差不多。

每个第一类都有__proto__那个属性,还主要包括数字类型,布尔类型等

下面 他们提到的new运算符,在new的过程中,也会将生成的显式第一类的__proto__属性对准缺省的蓝本,这样才是完整的实例化过程。 蓝本的内容差不多就这样了,内容不多认知一下就行

原型和原型链

蓝本链

上文提到了除null,undefiend等类型没__proto__属性外,其他都有__proto__属性,这就和返回值链一样,是两个链式结构,直到找到头为止。

tim.__proto__ === Man.prototype tim.__proto__.__proto__ === Object.prototype tim.__proto__.__proto__.__proto__ === null

当访问实例上的属性时,会首先查找实例上是否含有该属性,而当那个第一类上没那个属性时就会访问__proto__索引看看下面是不是,如果还没就继续沿着__proto__向上寻找,这就是蓝本链。

写在最后

这是那个系列的第五篇该文,咕咕咕挺久的了,每一次写该文单厢有一些收获,期望接下来我能做一只勤劳的鸽子。下篇该文打算讲讲this,下面的该文,我单厢尽量找一些代表性的题目,这样学习之后都能加以巩固,因此他们下次再见 了。

原型和原型链

相关文章

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

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