当前位置: 首页 > Web前端 > HTML

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

时间:2023-04-02 20:01:45 HTML

有朋友问怎么理解原型和原型链。这个问题,在面试中,很多同学经常会遇到。在这里给大家讲一下,方便大家记住。JavaScript的特性JavaScript是一种文字脚本语言,一种动态类型的、基于原型的语言。JavaScript与C++一样灵活,您可以使用JavaScript尝试不同的编程范式。比如类jQuery的函数式编程、基于过程的命令式编程、基于原型的面向对象编程。与Java、C#等面向对象语言不同,JavaScript采用了基于原型的继承方式。为什么会有原型和原型链?1994年,Netscape发布了0.9版的Navigator浏览器,但一开始的Js并没有继承机制,更别说像C++和Java同时兴盛的面向对象概念了。在实际开发过程中,工程师们发现有些问题没有继承机制是很难解决的,必须要有一种机制来关联所有的对象。鉴于以上情况,BrendanEich不想让Js的设计过于复杂,所以引入new关键字和constructor构造函数来简化对象的设计,引入原型函数对象来包含属性和方法所有实例对象的构造函数。引入proto和prototypechain的概念来解决继承问题。原型模式每个函数都有一个原型属性。这个属性有一个指向对象的指针。该对象包含由特定类型的所有实例共享的属性和方法。使用原型的优点是它允许所有对象实例共享它包含的内容。方法和属性使用in运算符和hasOwnProperty来确定给定属性是来自原型还是实例。in-true表示该属性存在于来自实例或原型的对象中。hasOwnProperty-true表示该属性来自实例,是实例属性。支持继承,通过原型链实现。所以原型链是JavaScript实现继承的重要途径。用户自定义类型的原型链我们一般如何检查JavaScript的变量数据类型?一般我们使用instanceof关键字来检测基于原型链的变量类型。我们可以先构造一个原型链,然后使用instanceof来检测类型:从上面提到的instanceof的结果,我们可以判断这些类型的继承级别:其实instanceof是通过原型链,例如LinstanceofR:如果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是由CreatedbyObject创建的;Funciton是由Function本身创建的!Object.prototype凭空出现!现在我们可以解释特殊对象的实例行为了:另外可以看到,当你声明一个函数(比如Animal)的时候,Animal.prototype会被自动赋值一个继承自Object的对象,这个对象的构造函数是等于动物。即:值得注意的是,如果Animal被Cat继承,Cat实例(如cat)的构造函数仍然是Animal。总结1.每个函数对象都有一个prototype属性,就是函数的原型对象。2、原型链是JavaScript中实现继承的重要方式。原型链的形成实际上是基于__proto__而不是原型。喜欢文章可以关注小编哦~