美文网首页程序员Web前端之路互联网科技
如何理解JavaScript的原型和原型链?

如何理解JavaScript的原型和原型链?

作者: 前端项目部 | 来源:发表于2019-07-01 13:56 被阅读39次

之前有朋友给我留言,问问怎么去理解原型和原型链的问题。这个问题,在面试中,很多同学经常都会遇到。

回复多了,觉得大家对这块知识点理解还是不够深。于是决定今天来给大家讲讲,方便大家记忆。

JavaScript的特点

JavaScript是一门直译式脚本语言,是一种动态类型、基于原型的语言。JavaScript的灵活性不亚于C++,你可以使用JavaScript尝试不同的程序设计范型。

比如类jQuery风格的函数式编程、基于过程的指令式编程、以及基于原型的面向对象编程。

不同于Java、C#等面向对象语言,JavaScript采用基于原型的继承方式。

为啥会有原型和原型链?

1994年,网景公司(Netscape)发布了Navigator浏览器0.9版,但是刚开始的Js没有继承机制,更别提像同时期兴盛的C++和Java这样拥有面向对象的概念。在实际的开发过程中,工程师们发现没有继承机制很难解决一些问题,必须有一种机制能将所有的对象关联起来。

Brendan Eich鉴于以上情况,但不想把Js设计得过为复杂,于是引入了new关键词和constructor构造函数来简化对象的设计,引入了prototype函数对象来包含所有实例对象的构造函数的属性和方法,引入了proto和原型链的概念解决继承的问题。

原型模式

每个函数都有一个prototype(原型)属性

这个属性都有一个指针,指向一个对象

这个对象包含由特定类型所有实例共享的属性和方法

使用原型的好处是 可以让所有对象实例共享它包含的方法和属性

通过in操作符和hasOwnProperty来判断给定属性是来自于原型还是实例

in- true 代表属性在对象中存在 来自实例或者来自原型

hasOwnProperty- true代表属性来自于实例 是实例属性

原型链

ECMAScript中只支持实现继承,而且是通过原型链的方式来实现的。所以原型链是JavaScript实现继承的一种重要方式。

用户定义类型的原型链

我们一般如何来检查JavaScript的变量数据类型?一般我们都是通过instanceof关键字,可以基于原型链来检测变量的类型。

我们可以先构造一个原型链,再用instanceof来检测类型:

由上面讲的instanceof的结果,可以判断这些类型的继承层级:

事实上instanceof是通过原型链来检测类型的,例如L instanceof R:如果R.prototype出现在了L的原型链上则返回true,否则返回false。

用JavaScript来描述instanceof的实现逻辑是这样的:

JavaScript原型链

JavaScript原型链先给大家看一个JavaScript的原型链结构图。

悄悄告诉你理解原型链的小技巧:将__proto__箭头视作泛化(子类到父类)关系!

那么图中所有的虚线将构成一个继承层级,而实线表示属性引用。

图中给出了Object.prototype.__proto__ == null,但它还没有标准化,在Chrome、Safari和Node.js下它是不同的东西。

但可以看到JavaScript中所有对象的共同隐式原型为Object.prototype,它的上一级隐式原型是什么已经不重要了, 因为它不会影响所有内置对象以及用户定义类型的原型链结构。

上图其实已经解释了不同内置对象instanceof的行为,我们来看Function和Object的特殊之处:

Object是由Function创建的:因为Object.__proto__ === Funciton.prototype;

同理,Function.prototype是由Object创建的;

Funciton是由Function自己创建的!

Object.prototype是凭空出来的!

现在我们可以解释特殊对象的instance行为了:

另外可以看到当你声明一个函数(比如Animal)时,Animal.prototype会自动被赋值为一个继承自Object的对象, 而且该对象的constructor等于Animal。即:

值得注意的是Animal如果被Cat继承,Cat实例(比如cat)的constructor仍然是Animal。

总结

1.每个函数对象都有一个 prototype 属性,这个属性就是函数的原型对象。

2.原型链是JavaScript实现继承的重要方式,原型链的形成是真正是靠__proto__ 而非prototype。

自己是从事了五年的前端工程师,不少人私下问我,2019年前端该怎么学,方法有没有?没错,自己整理了一份2019最全面前端学习资料,从最基础的HTML+CSS+JS到HTML5的项目实战的学习资料都有整理,送给每一位前端小伙伴,有想学习web前端的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴,需要可以私聊我哟,也有我的前端开发qun,【四八四】【七五七】【七六零】,对于学习web前端有任何问题(学习方法,学习效率,如何就业)都可以问我,最后可以点一波关注哟!

相关文章

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • 原型和原型链篇

    原型和原型链 1.理解原型设计模式以及JavaScript中的原型规则 原型设计模式JavaScript是一种基于...

  • 前端基础整理

    如何理解JavaScript原型链JavaScript中的每个对象都有一个prototype属性,我们称之为原型,...

  • 简单认识 JS 原型与原型链

    原型是JavaScript中一个比较难理解的概念, 为深入理解JavaScript 中的原型、原型链,整理下思路。...

  • JavaScript面向对象设计

    参考资料: 深入理解JavaScript系列(5):强大的原型和原型链 JavaScript new关键字 jav...

  • 如何理解JavaScript的原型和原型链?

    之前有朋友给我留言,问问怎么去理解原型和原型链的问题。这个问题,在面试中,很多同学经常都会遇到。 回复多了,觉得大...

  • 原型链

    如何理解JavaScript中的原型和原型链 本文基于理解基础知识进行的拓展,并不会包含太多的基础知识。 首先是一...

  • 个人对面向对象的理解

    我对原型和原型链式这样理解的,原型和原型链在javascript当中主要用来体现对象 与属性之间的关系,它主要应用...

  • Javascript学习笔记-原型链

    对于Javascript原型链,是Javascript中很重要的内容,要理解关键有三点:Javascript中原型...

  • javascript 基础攻关(二)—— 原型和原型链

    javascript 基础攻关(二)—— 原型和原型链 如何判断一个变量是数组类型 写一个原型链继承的例子 描述...

网友评论

    本文标题:如何理解JavaScript的原型和原型链?

    本文链接:https://www.haomeiwen.com/subject/fysgcctx.html