继承和原型链
tem.pw主要存放原创的**翻译**文章,即知识主体并非产自我这里的文章,但同时为了补充说明,我也会在里面添加一些东西。本系列来自MDN的文章。更多原创文章可以参考http://nul.pw。
文章翻译来源:blast
禁止转载
继承和原型链
JavaScript对于基于类的语言(如Java或C ++)有经验的开发人员有点混乱,因为它是动态的,并且不提供类实现(类关键字在ES2015中引入,但是只是作为语法糖,JavaScript仍然是基于原型的)。
当涉及到继承时,JavaScript只有一个结构:对象。每个对象都有一个私有属性(称为[[Prototype]]),它保存一个链接到另一个叫做它的“原型”的对象。该原型对象具有自己的原型,这样循环下去,直到一个对象的原型是null。根据定义,null没有原型,并且作为此原型链中的最终端。
JavaScript中几乎所有的对象都是Object的实例,它位于原型链的顶端。
虽然这通常被认为是JavaScript的弱点之一,但是原型继承模型实际上比经典模型更强大。例如,在原型模型之上构建经典模型是相当容易的。
原型链的继承
继承属性
JavaScript对象是动态的“包”属性(称为own properties)。 JavaScript对象具有到原型对象的链接。 当尝试访问对象的属性时,该属性不仅将在对象上寻找,而且还可能在对象的原型,以及原型的原型等上进行查找,直到找到具有匹配名称的属性或者结束的原型链。
根据ECMAScript标准,someObject.[[Prototype]]的符号用于指定someObject的原型。 从ECMAScript 2015起,使用访问器Object.getPrototypeOf()和Object.setPrototypeOf()访问[[Prototype]]。 这相当于JavaScript属性的__proto__,这是非标准的,但实际上许多浏览器实现了它。
它不应该与函数的func.prototype属性相混淆,函数的prototype是指定在作为构造函数使用给定函数创建的对象的所有实例时分配的[[Prototype]]。 Object.prototype属性表示Object原型对象。