如何理解JavaScript的原型和原型链?
栏目: JavaScript · 发布时间: 7年前
内容简介:之前有朋友在公众号给我留言,问问怎么去理解原型和原型链的问题。这个问题,在面试中,很多同学经常都会遇到。回复多了,觉得大家对这块知识点理解还是不够深。于是决定今天来给大家讲讲,方便大家记忆。
之前有朋友在公众号给我留言,问问怎么去理解原型和原型链的问题。这个问题,在面试中,很多同学经常都会遇到。
回复多了,觉得大家对这块知识点理解还是不够深。于是决定今天来给大家讲讲,方便大家记忆。
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的原型链结构图。
悄悄告诉你理解原型链的小技巧: 将__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。
好了,今天的讲解就那么多,如果你还有什么前端问题想提问的,或者你想李老师下次给大家讲什么内容,可以直接留意提问,说不定下次文章就会讲解了。
更多网页前端开发技术干货,行业资讯,面试技巧,欢迎关注前端开发公众号 【网页前端开发学习】
如果你觉得这篇文章对你有帮助,请转发点赞支持一下!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Design Accessible Web Sites
Jeremy Sydik / Pragmatic Bookshelf / 2007-11-05 / USD 34.95
It's not a one-browser web anymore. You need to reach audiences that use cell phones, PDAs, game consoles, or other "alternative" browsers, as well as users with disabilities. Legal requirements for a......一起来看看 《Design Accessible Web Sites》 这本书的介绍吧!
URL 编码/解码
URL 编码/解码
HSV CMYK 转换工具
HSV CMYK互换工具