原型、原型链以及继承的理解,一直是JavaScript中的重难点部分,对此部分的学习任重而道远,就此篇谈谈我个人所收获的关于原型链的知识以及自己的理解
摘自JavaScript高级程序设计:
继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实现继承则继承实际的方法.由于js中方法没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支持实现继承,而且其 实现继承 主要是依靠原型链来实现的.
通过对继承和原型链的描述,我个人理解为,构造函数 constructor 都有一个原型对象 prototype ,而对于我们所构造出来的函数,它内部的一些属性不一定会按照我们的想法存在,那么当这个属性不存在构造函数中,这个时候我们想要调用构造函数的某个属性值,就只能通过原型链,前往它原型对象上面找:
构造函数.proto = 它原型对象.prototype
这种关系可以帮助我们在构造函数的原型对象上面调用我们需要的属性
而对于这个原型对象来讲,它的原型对象便是浏览器上的Object
它原型对象.prototype = Object.prototype
在我的理解中,Object就是JavaScript中所有对象的顶层。只要是对象,所有对象沿着原型链去找,那就是Object,我理解为它是构造函数的终点。
那么说回原型链的继承,继承的定义是子承父类,也就是说,一个构造函数和它的原型对象好比父子关系,子类继承了父类的属性,从而在调用属性时,构造函数可以调用原型对象的属性。
以下是摘自掘进的一段文字:
new 运算符
为了追本溯源, 我顺便研究了new运算符具体干了什么?发现其实很简单,就干了三件事情.
第一行,我们创建了一个空对象obj;
第二行,我们将这个空对象的__proto__成员指向了F函数对象prototype成员对象;
第三行,我们将F函数对象的this指针替换成obj,然后再调用F函数.
我们可以这么理解: 以 new 操作符调用构造函数的时候,函数内部实际上发生以下变化:
1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this.
作者:路易斯
链接:juejin.cn/post/684490…
由此我觉得对原型链以及继承有了更深的了解
敬请指正!