为什么在Javascript中RegExp有一个双对象原型

Why in Javascript RegExp have a double Object prototype

本文关键字:对象 原型 有一个 RegExp Javascript 为什么      更新时间:2023-09-26

我对一个正则表达式有一个与对象"类"相关的双原型链非常感兴趣。

//object Object --> Object --> Null
var regex = (/checking'sprototypes/gmi);
console.log(toString.call(regex.__proto__.__proto__.__proto__));

为什么会发生这种情况?

当我打印regex.__proto__时,我得到"对象原型"而不是RegExp原型。如果我打印regex.__proto__.__proto__,我也会得到"对象原型"。

查看此代码以获取更多示例http://codepen.io/gpincheiraa/pen/pEydja

JavaScript中的继承不是建立在上,而是建立在原型上。对象原型向基于这些原型的其他对象公开可用的属性和方法,并且可以在层次结构中链接。

regex.__proto__;                    // RegExp prototype
regex.__proto__.__proto__           // Object prototype
regex.__proto__.__proto__.__proto__ // null

这里可以看到正则表达式有一个原型,这个原型是RegExp原型,它暴露了exectest等正则表达式特定的方法。RegExp原型又以Object原型为基础,后者公开了(几乎)所有对象共同的方法和属性,比如hasOwnProperty__proto__ getter本身。Object原型是层次结构的顶端,没有原型(null)。